不知道现在是否还有人需要这个提示,我在一些旧程序升级时用到的。
- 首先需要一个Report文件;<xxx.rpt>
- 然后你需要把数据库连接字符串写好;
<connectPath = "Driver=SQL Server;Server=127.0.0.1;Uid=doublecells;Pwd=xxx;Database=pubs">
- 在使用程序中调用这个文件之前先要引入控件;<Crystal Report Control>
- 把控间拖到需要打印功能的"Form"窗体上,起个名字如"cr8";
- 接下来就是操作报表文件。
- cr8.ReportFileName = App.Path & "/xxx.rpt"
- cr8.Connect = connectPath //主要就是这句话
-------------------------------------------------
下面的语句只代表一种输出方法。
这种方法需要把一些SQL语句写到Crystal Report文件中
-------------------------------------------------
- cr8.SelectionFormula = "{authers.au_id}='172-32-1176'"
- cr8.RetrieveDataFiles
- cr8.RetrieveStoredProcParams
- cr8.PrintReport
有不同意见,欢迎交流探讨
(更新 07-06-25)
看来世上很多事情是需要实践来验证的。
前几天本以为上面的方法已经解决了Crystal Report的动态连接数据库问题,
- 没想到把修改后的程序安装到新的机器上报表还是不能连接到数据库(因为数据库名称改变了)。
- 花了些时间,通过找资料什么的,又弄了下面这种方法。
- 开始:
- 先定义个函数来检测连接新数据库的数据源是否建立,当然这是程序中来完成的。
- exam Function CheckIsAlreadyCreateDSN();
- 在实现功能前要引入一些API函数,来实现一些对注册表和系统的操作。
- (1)Public Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
- 检测当前系统的<Windows>目录所在的路径(exam <C:/Windows>),
- 目的是为了找到"system32"目录下的<Sqlsrv32.dll>
- (2)Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _
(ByVal HKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
- 创建新注册表项
- (3)Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
(ByVal HKey As Long, ByVal lpSubKey As String) As Long
- 删除注册表项
- (4)Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" _
(ByVal HKey As Long, ByVal lpValueName As String) As Long
- 删除子键项
- (5)Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
(ByVal HKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
- 打开注册表项
- 如果打开成功返回值:0
- (6)Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
(ByVal HKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal _
dwType As Long, lpData As Any, ByVal cbData As Long) As Long
- 设置子键键值
- 设置一些公共的常量在声明中
- '----------------------------
- ' Declare some need contants
- '----------------------------
- Const HKLM_SOFTWARE = "SOFTWARE"
- Const HKLM_ODBC = "ODBC"
- Const HKLM_ODBC_INI = "ODBC.INI"
- Const HKLM_ODBC_DATA_SOURCE = "ODBC Data Sources"
- Const KEY_VALUE_DATABASE = "Database"
- Const KEY_VALUE_DRIVER = "Driver"
- Const KEY_VALUE_LASTUSER = "LastUser"
- Const ERROR_SUCCESS = 0
- 定义一些变量后,先获取Sql Server数据源驱动(看个人爱好也可以先做其他的)
- '-----------------------------------------
- ' Get the sql server driver DLL file path
- '-----------------------------------------
- lDriver = GetWindowsDirectory(sTemp, Len(sTemp))
- sWindowsPath = Left(sTemp, lDriver)
- sDriverPath = sWindowsPath & "/system32/Sqlsvr32.dll"
- 可以用读取配置文件方式来获取用户设置的数据库名称/IP地址,
- 当获取到数据库连接名称/IP地址后,开始进行对注册表的设置。
- '-----------------------------------
- ' Set an new DSN to Windows regedit
- '-----------------------------------
- KEY_DATA_SERVER = g_sServerName
- HKLM_TEMPLATE = g_sServerName
- sPath = HKLM_SOFTWARE & "/" & HKLM_ODBC & "/" & HKLM_ODBC_INI & "/" & HKLM_TEMPLATE
- 获取注册表中<HKLM的"Software/ODBC/ODBC.INI">
- sPath2 = HKLM_SOFTWARE & "/" & HKLM_ODBC & "/" & HKLM_ODBC_INI & "/" & HKLM_ODBC_DATA_SOURCE
- 获取注册表中<HKLM的"Software/ODBC/ODBC.INI/ODBC Data Source">
- lRegResult = RegOpenKey(HKEY_LOCAL_MACHINE, sPath, hCurKey)
- 尝试打开注册表项
- If lRegResult = ERROR_SUCCESS Then
- 'this part allow to add some detail operate
- Else
- 没有打开需要的注册表项,进行创建。
- lResult = RegCreateKey(HKEY_LOCAL_MACHINE, sPath, hCurKey)
- If lResult = ERROR_SUCCESS Then
- RegSetValueEx hCurKey, KEY_VALUE_DATABASE, 0, 1, ByVal KEY_DATA_DATABASE, Len(KEY_DATA_DATABASE)
- RegSetValueEx hCurKey, KEY_VALUE_DRIVER, 0, 1, ByVal sDriverPath, Len(sDriverPath)
- RegSetValueEx hCurKey, KEY_VALUE_LASTUSER, 0, 1, ByVal KEY_DATA_LASTUSER, Len(KEY_DATA_LASTUSER)
- End If
- lResult2 = RegOpenKey(HKEY_LOCAL_MACHINE, sPath2, hRctKey)
- If lResult2 = ERROR_SUCCESS Then
- RegSetValueEx hRctKey, HKLM_TEMPLATE, 0, 1, ByVal KEY_DATA_SQLSERVER, Len(KEY_DATA_SQLSERVER)
- End If
- End If
创建完成后可以到控制面板里的数据源管理界面查看一下,是否存在了建立的数据源。
很多地方都可以进行细加工,甚至可以进一步把功能以DLL的形式来完成。那就看客自便了。
先写到这吧,有新发现的问题再续,欢迎交流。