SQL Reader的字符串问题?
时间:2020-03-06 15:00:17 来源:igfitidea点击:
Function FillAdminAccount() As Boolean FillAdminAccount = True Try SQLconn.ConnectionString = "connect timeout=9999999;" & _ "data source=" & DefaultIserver & ";" & _ "initial catalog=" & DefaultIdBase & "; " & _ "user id=userid;" & _ "password=userpass;" & _ "persist security info=True; " & _ "packet size=4096" SQLconn.Open() SQLcmd.CommandType = CommandType.Text SQLcmd.CommandText = "Select distinct username, cast(convert(varchar,userpassword) as varchar) as 'userpassword' from " & tblUsersList & " where usertype='MainAdmin'" SQLcmd.Connection = SQLconn SQLreader = SQLcmd.ExecuteReader While SQLreader.Read = True CurrentAdminUser = SQLreader("username").ToString CurrentAdminPass = SQLreader("userpassword").ToString 'PROBLEM' End While Catch ex As Exception ErrorMessage(ex) Finally If SQLconn.State = ConnectionState.Open Then SQLconn.Close() If SQLreader.IsClosed = False Then SQLreader.Close() End Try End Function 'FillAdminAccount
请查看带有注释问题的行。在此代码上,输出等于" userpassword。如我们所见,右侧没有引号,我不知道为什么。顺便说一下,数据库中userpassword的数据类型为BINARY。我在此。谢谢..x_x
解决方案
可能是
as varchar) as 'userpassword'
应该
...as varchar) as [userpassword] ..
或者
...as varchar) as userpassword ..
切勿将实际密码存储在数据库中。现在看来,由于转换/广播操作,密码可能不是纯文本,但是我们仍然遇到问题。至少使用的任何加密都是易于逆转的,并且如果sql服务器最终与应用程序不在同一台计算机上,则密码将以纯文本形式通过网络传输。
如果必须执行此操作(可能是由于旧系统或者以上命令所致),则至少要在服务器上进行匹配,以使密码永远不会回到应用程序中。
我们应该做的是使用类似SQL Server 2005的HashBytes()函数之类的方法来仅存储实际密码的哈希值。当有人尝试登录时,对尝试输入的密码进行哈希处理并匹配哈希值。
关于特定问题,我的猜测是强制转换或者转换操作失败,导致NULL值返回到应用程序。而且,我们是否同时拥有相同类型的CAST()和CONVERT()?这是多余的。
@Oglester是正确的,它是'userpassword'周围的单引号。
这不是错误,但只是愚蠢的:
cast(convert(varchar,userpassword) as varchar
我们可以使用强制转换或者转换,但两者都没有意义。