我现在写的程序用的都是这样一种模式,数据库为sql,客户端要访问数据库通过两种方式:
1、在客户端程序中设置连接信息并将其存入注册表。
2、用odbc连接
以上的程序的缺点是:当数据库密码改变后需更改所有的客户端,而且安全性较差。
我想用com组件来觖决是一个不错的办法,想请大家帮帮忙忙或者其他好的方法也可以。
1、在客户端程序中设置连接信息并将其存入注册表。
2、用odbc连接
以上的程序的缺点是:当数据库密码改变后需更改所有的客户端,而且安全性较差。
我想用com组件来觖决是一个不错的办法,想请大家帮帮忙忙或者其他好的方法也可以。
1、构造数据库连接组件DatabaseConnect.DLL,从DB.INI文件中读取连接信息,另可加入加密解密组件于服务器上,加密组件无须发布
2、将组件发布于服务器上,导出组件安装程序*.msi(也可通过程序中创建)
3、在客户端安装,注意权限等问题,可在服务器组件管理中设置
这样数据库密码改变后可不需更改客户端设置
你把没办法实现的地方说清楚,如果明天还未解决的话,我再说说我的做法。今天有事,要下线了
这样com组件和程序都保留在客户端使用com+组件
1、构造数据库连接组件DatabaseConnect.DLL,从DB.INI文件中读取连接信息,另可加入加密解密组件于服务器上,加密组件无须发布
2、将组件发布于服务器上,导出组件安装程序*.msi
3、在客户端安装,注意权限等问题,可在服务器组件管理中设置
这样数据库密码改变后可不需更改客户端设置
同意
举个例子
新建ACTIVE DLL工程,工程名COM_Test,类名clsAdd,类中粘贴代码:
Option Explicit
Public x, y As Integer
Public Function myAdd() As Integer
myAdd = x + y
End Function
编译得到COM_Test.dll,下面开始注册组件
开始-设置-控制面板-组件服务,找到COM+应用程序,右键新建 应用程序,创建一个空应用程序,就叫myadd吧,然后右键新建组建,导入刚才生成的COM_Test.dll,成功以后点击myadd应用程序,将其导出,注意类型选代理,就会生成myadd.msi和myadd.msi.cab两个文件Option Explicit
Dim myAdd As New clsAddPrivate Sub Command1_Click()With myAdd
.x = Val(Text1.Text)
.y = Val(Text2.Text)
Text3.Text = .myAdd
End WithEnd SubPrivate Sub Command2_Click()
Set myAdd = Nothing
End
End SubPrivate Sub Form_Load()
Set myAdd = New clsAdd
End Sub
然后编译生成COM_CLIENT.EXE,将这个文件和刚才导出的两个文件复制到客户机上(WIN2000),
在客户机上安装myadd.msi,再运行COM_CLIENT.EXE试试!
注意在客户机登录的用户要有安装和访问服务器组件的权限!
启动vb6.0,新建-->Active dll工程。单击"工程"-->引用,选择"microsoft active server pages object library"
和"microsoft activeX data objects 2.1 library"两项。将类模块的名称改为dcss.将工程的名称改为yygwy.保存工程文件yygwy.vbp和类文件dcss.cls。
在dcss.cls中写入:
Private myscriptingcontext As ScriptingContext
Private myapplication As Application
Private myrequest As Request
Private myresponse As Response
Private myserver As Server
Private mysession As Session Public Sub onstartpage(passedscriptingcontext As ScriptingContext)
Set myscriptingcontext = passedscriptingcontext
Set myapplication = myscriptingcontext.Application
Set myrequest = myscriptingcontext.Request
Set myresponse = myscriptingcontext.Response
Set myserver = myscriptingcontext.Server
Set mysession = myscriptingcontext.Session
End Sub Public Sub onendpage()
Set myscriptingcontext = Nothing
Set myapplication = Nothing
Set myrequest = Nothing
Set myresponse = Nothing
Set myserver = Nothing
Set mysession = Nothing
End Sub '以上语句是必须的。
'定义两个公有函数 Public Function rsresult(strsql As String) As Recordset
Dim mycnn As Connection
Dim myset As Recordset
Dim strconnstring As String
'strconnstring = "provider=sqloledb.1;
password=;" & "user id=sa;" & "initial catalog=vlog;" & "data source=hpe60;
connect timeout=15"
strconnstring = "driver={sql server};server=yang;uid=sa;pwd=;
database=dcss"
'mycnn.ConnectionString = strconnstring
mycnn.Open strconnstring
myset.ActiveConnection = mycnn
myset.Open strsql, mycnn, 3, adCmdText
Set rsresult = myset
End Function Public Function datasource() As Variant
datasource = "driver={sql server};server=yang;uid=sa;pwd=; database=dcss"
End Function 编译生成dcss.dll文件。注册regsvr32 路径\dcss.dll。
用visual interdev打开global.asa文件.当然了,你也可以在其它文件中使用。
set dcss=server.CreateObject("yygwy.dcss")
oconn=dcss.datasource()
application("strconn")=oconn 在其它的页面中如下调用即可:
set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open application("strconn")
通过组件来读取即可
最后形成strconnstring = "driver={sql server};server=yang;uid=sa;pwd=;
这样的即可但是这样的话,ini文件要加密,麻烦抱歉,我在出差,没有vb
模块内容:
Option Explicit
'lpBuffer : buffer for system directory
'uSize : size of directory buffer
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long'lpAppName : section name
'lpKeyName : key name
'lpDefault : default string
'lpReturnedString : destination buffer
'nSize : size of destination buffer
'lpFileName : initialization file name
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long'lpAppName : section name
'lpKeyName : key name
'lpString : string to add
'lpFileName : initialization file
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) As Long
'////////////////////////////////////////////////////////////////////////////////
'// 函数功能:从ini配置文件中读取指定段名、关键字名的值
'// 调用语法: GetInIKeyValue(SectionName as string,KeyName As String,FileName As String)
'// 参数说明:
'// SectionName :段名
'// KeyName :关键字名
'// FileName :ini文件名包括路径
'// 返 回 值:
'// String :返回关键字值
'// 处理说明:
'// 调用API函数GetPrivateProfileString
'//////////////////////////////////////////////////////////////////////////////
Public Function GetInIKeyValue(ByVal SectionName As String, _
ByVal KeyName As String, _
ByVal FileName As String) As String
Dim KeyValue$
Dim strTmp As String
KeyValue$ = String$(512, " ")
GetPrivateProfileString SectionName, KeyName, "", KeyValue$, 512, FileName
strTmp = Trim(KeyValue$)
GetInIKeyValue = Left(strTmp, Len(strTmp) - 1)
End Function'////////////////////////////////////////////////////////////////////////////////
'// 函数功能:从ini配置文件中写入指定段名、关键字名及值
'// 调用语法: SetInIKeyValue(SectionName as string,KeyName As String,KeyValue as string ,FileName As String)
'// 参数说明:
'// SectionName :段名
'// KeyName :关键字名
'// KeyValue :关键字值
'// FileName :ini文件名包括路径
'// 返 回 值:
'// 处理说明:
'// 调用API函数WritePrivateProfileString
'//////////////////////////////////////////////////////////////////////////////
Public Sub SetInIKeyValue(ByVal SectionName As String, _
ByVal KeyName As String, _
ByVal KeyValue As String, _
ByVal FileName As String)
Dim lng As Long
lng = WritePrivateProfileString(SectionName, KeyName, KeyValue, FileName)
End Sub'////////////////////////////////////////////////////////////////////////////////
'// 函数功能:读取系统目录路径
'// 调用语法: GetSysDir()
'// 参数说明:
'// 返 回 值:
'// String :系统目录
'// 处理说明:
'// 调用API函数GetSystemDirectory
'//////////////////////////////////////////////////////////////////////////////
Public Function GetSysDir() As String
Dim sysDir$
Dim strTmp As String
sysDir = String$(128, " ")
GetSystemDirectory sysDir$, 127
strTmp = Trim(sysDir$)
GetSysDir = Left(strTmp, Len(strTmp) - 1)
End Function'////////////////////////////////////////////////////////////////////////////////
'// 函数功能:加密与解密字符串
'// 调用语法: PasswordEncrypt(ByVal strVar As String)
'// 参数说明:
'// strVar : 待加密字符
'// 返 回 值:
'// String : 已经加密字符串
'// 处理说明:
'// 255-取字符的ASCII码
'//////////////////////////////////////////////////////////////////////////////
Public Function PasswordEncrypt(ByVal strVar As String) As String
Dim intI As Integer
Dim bytVar() As Byte
bytVar = StrConv(strVar, vbFromUnicode)
For intI = LBound(bytVar) To UBound(bytVar)
bytVar(intI) = (255 - bytVar(intI))
Next intI
strVar = StrConv(bytVar, vbUnicode)
PasswordEncrypt = strVar
End Function
Option Explicit'********************************************************************************
'* 模块名称:ConnectDB
'* 功能描述:实现读取连接数据库对象
'********************************************************************************Const PKEY = "AA 44 78 19 CC B5 35 35" '密钥Private mvaradoConn As ADODB.Connection '数据连接对象'数据连接对象为只读属性
Public Property Get adoConn() As ADODB.Connection
If mvaradoConn.State <> adStateOpen Then
Err.Raise vbObjectError + 514, , "当前没有建立数据连接"
Else
Set adoConn = mvaradoConn
End If
End Property
Private Sub Class_Initialize()
Dim objSP As SharedProperty '
Dim objSPG As SharedPropertyGroup '
Dim objSPGM As SharedPropertyGroupManager '
Dim blnFlag As Boolean '
Dim strConn As String '
Dim strErr As String '
Dim adoConn As ADODB.Connection '
On Error GoTo ErrorHandler
Set adoConn = New ADODB.Connection
adoConn.CursorLocation = adUseClient
Set objSPGM = New SharedPropertyGroupManager
Set objSPG = objSPGM.CreatePropertyGroup("DBConnect", LockSetGet, Standard, blnFlag)
If blnFlag = False Then
blnFlag = ReadConfig(strConn, strErr)
If blnFlag = False Then GoTo ErrorHandler '读取连接参数失败
adoConn.Open strConn '连接数据库
Set objSP = objSPG.CreateProperty("ConnectString", blnFlag)
objSP.Value = strConn
End If
Set objSP = objSPG.CreateProperty("ConnectString", blnFlag)
If blnFlag = False Then GoTo ExitHandler
If adoConn.State <> adStateOpen Then adoConn.Open objSP.Value
Set mvaradoConn = adoConn
Set objSPGM = Nothing
Exit Sub
ExitHandler:
Set objSPGM = Nothing
strErr = "缺少连接字符信息,无法建立与数据库连接"
ErrorHandler:
If strErr = "" Then
Err.Raise vbObjectError + 513, Err.Source, Err.Description '可能是因为缺少加密解密组件而出错
Else
Err.Raise vbObjectError + 513, Me, strErr
End If
End Sub
'********************************************************************************
'* 功能 描述:从数据库配置文件中读取连接信息DBConfig.ini
'* 参数 说明:
'* 输入:
'* 输出:strConn连接字串,strErr出错信息
'* 返回值说明:成功-->True,失败-->False
'********************************************************************************
Private Function ReadConfig(ByRef strConn As String, ByRef strErr As String) As Boolean
Dim strProvider As String '数据提供者
Dim strSName As String '服务器名Data Source
Dim strDBName As String '数据库名Initial Catalog
Dim strUID As String '数据库访问用户名
Dim strPWD As String '密码
Dim strFlag As String '密码加密标志
Dim strFilePath As String '配置文件DBConfig.ini存储路径
Dim objEnt As UnicodeTextEncrypt.IUnicodeTextEncrypt
Dim blnFlag As Boolean
On Error GoTo ExitHandler
strFilePath = App.Path & "\DBConfig.ini"
strProvider = Trim(GetInIKeyValue("DatabaseInfo", "Provider", strFilePath))
strSName = Trim(GetInIKeyValue("DatabaseInfo", "Data Source", strFilePath))
strDBName = Trim(GetInIKeyValue("DatabaseInfo", "Initial Catalog", strFilePath))
strUID = Trim(GetInIKeyValue("DatabaseInfo", "User ID", strFilePath))
strPWD = Trim(GetInIKeyValue("DatabaseInfo", "Password", strFilePath))
strFlag = Trim(GetInIKeyValue("DatabaseInfo", "Flag", strFilePath))
If strProvider = "" Then
strErr = "缺少数据提供者[Provider],请查看数据库配置文件DBConfig.ini"
GoTo ExitHandler
End If
If strSName = "" Then
strErr = "缺少数据源[Data Source],请查看数据库配置文件DBConfig.ini"
GoTo ExitHandler
End If
strConn = "Provider=" & strProvider & ";Data Source=" & strSName
If strDBName <> "" Then strConn = strConn & ";Initial Catalog=" & strDBName
strConn = strConn & ";User ID=" & strUID & ";Password="
If strPWD = "" Then GoTo ContineH '不加密也不解密
Set objEnt = New UnicodeTextEncrypt.DesUnicode
If strFlag = "0" Then
strConn = strConn & strPWD
blnFlag = objEnt.UnicodeTextEncrypt(strPWD, PKEY)
If Not blnFlag Then
Set objEnt = Nothing
strErr = "加密失败,请查看数据库配置文件DBConfig.ini"
GoTo ExitHandler
End If
SetInIKeyValue "DatabaseInfo", "Password", "A" & strPWD & "A", strFilePath
SetInIKeyValue "DatabaseInfo", "Flag", "1", strFilePath
Else
strPWD = Mid(strPWD, 2, Len(strPWD) - 2)
blnFlag = objEnt.UnicodeTextDecrypt(strPWD, PKEY)
If Not blnFlag Then
Set objEnt = Nothing
strErr = "解密失败,密文不正确,请查看数据库配置文件DBConfig.ini"
GoTo ExitHandler
End If
strConn = strConn & strPWD
End If
Set objEnt = Nothing
ContineH:
ReadConfig = True
Exit Function
ExitHandler:
If strErr = "" Then strErr = Err.Description '可能是因为缺少加密解密组件而出错
ReadConfig = False
End Function