【发布时间】:2010-10-08 04:22:59
【问题描述】:
背景:我正在将使用 MS Access 进行数据存储的 VB6 应用程序重写为使用 VB.NET 和 MS SQL Server 的应用程序。
我很好奇在我的应用程序中需要连接到数据库的不同表单之间传递连接的最佳方式。现在我已经建立了一个类来管理连接字符串以安全的方式在表单之间传递:
公共类登录凭据
私有 unname 作为字符串
私有密码哈希()作为字节 = {0}
Private server_name As String '未用于访问样式数据库
私有数据库名作为字符串
Private st As ServerType '允许不同连接的枚举
Private tdes As TripleDES '加密类来加密内存中的密码
公共子新()
unname = ""
server_name = ""
数据库名 = ""
st = ServerType.stNotDefined
结束子
Public Sub New(ByVal 用户名作为字符串,_
ByVal 密码为字符串,_
ByVal ServerName 作为字符串,_
ByVal 数据库名称作为字符串,_
ByVal ServType 作为 ServerType)
tdes = 新的 TripleDES
uname = 用户名
password_hash = tdes.Encrypt(密码)
server_name = 服务器名
dbname = 数据库名称
st = 服务类型
tdes = 没有
结束子
公共只读属性 Server_Type() As ServerType
得到
回程
结束获取
结束属性
公共只读属性 CompanyName() 作为字符串
得到
返回 dbname.Remove(0, 4)
结束获取
结束属性
公共属性 UserName() 作为字符串
得到
返回名称
结束获取
设置(ByVal 值作为字符串)
unname = 值
结束集
结束属性
公共属性密码()作为字符串
得到
tdes = 新的 TripleDES
返回 tdes.Decrypt(password_hash)
tdes = 没有
结束获取
设置(ByVal 值作为字符串)
tdes = 新的 TripleDES
password_hash = tdes.Encrypt(值)
tdes = 没有
结束集
结束属性
公共属性 ServerName() 作为字符串
得到
返回 server_name
结束获取
设置(ByVal 值作为字符串)
server_name = 值
结束集
结束属性
公共属性 DatabaseName() 作为字符串
得到
返回数据库名
结束获取
设置(ByVal 值作为字符串)
数据库名称 = 值
结束集
结束属性
公共函数 GetConnectionString() 作为字符串
暗淡 cstring As String = ""
tdes = 新的 TripleDES
选择案例
案例服务器类型.stSQLServer
cstring = "用户 ID=" & uname & ";" &_
"密码=" & tdes.Decrypt(password_hash) & ";" &_
"初始目录=" & dbname & ";" &_
“数据源=”& server_name
结束选择
tdes = 没有
返回字符串
结束功能
结束类
我一直在将我的对象的引用传递给我需要连接到数据库的任何表单,如下所示:
'在表单声明中
私有 myLC 作为 LoginCredentials
Public Sub New(ByRef lc As LoginCredentials)
初始化组件()
myLC = lc
结束子
然后我会创建一个新的连接对象,做我需要做的事情,然后关闭连接并销毁连接对象。当我不久前在 ADO 中使用 VB6 完成此操作时,连接创建的进程在连接对象被销毁时被终止,但情况似乎不再如此。现在每次我创建一个新的连接对象并连接到我的服务器时,都会创建一个新进程,然后在我关闭连接时进入睡眠状态。一段时间后,服务器将开始拒绝连接,直到我登录并终止我的应用程序创建的所有进程。显然这不是正确的,我想学习正确的方法。
在我的表单之间通过引用(或在包装类中)简单地传递相同的连接对象,让连接对象保持打开状态会更好吗?
关闭连接以使我最终不会在我的 SQL 服务器上获得一堆休眠进程的正确方法是什么? SQL Server 中是否有可以调整为在一段时间不活动后自动终止进程的设置?
您是否考虑在运行时内存中加密密码过大?
感谢您的帮助。 :)
【问题讨论】:
-
您是否考虑过使用 Enterprise Library 进行数据连接? codeplex.com/entlib
标签: .net sql-server vb.net security