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
答案 0 :(得分:2)
永远不要在db中存储实际密码。现在,由于转换/转换操作,您的密码可能看起来不是纯文本,但您仍然遇到问题。至少使用的任何加密都是可逆的,如果你的sql server最终与应用程序不同,那么密码就会以纯文本形式通过网络传输。
如果您必须这样做(可能是因为遗留系统或上述授权),那么至少在服务器处执行匹配的,以便密码永远不会回来申请。
应该正在做的是使用类似SQL Server 2005的HashBytes()函数来存储实际密码的哈希值。当有人尝试登录时,请勾选他们尝试过的密码并匹配哈希值。
至于你的具体问题,我的猜测是转换或转换操作失败导致返回给应用程序的NULL值。你有两个一个CAST()和一个CONVERT()到同一类型?这是多余的。
答案 1 :(得分:1)
可能是
as varchar) as 'userpassword'
应该是
...as varchar) as [userpassword] ..
或
...as varchar) as userpassword ..
答案 2 :(得分:1)
@Oglester是对的,它是'userpassword'周围的单引号。
这不是一个错误,但它只是愚蠢:
cast(convert(varchar,userpassword) as varchar
您可以使用强制转换或转换,但使用两者都没有意义。