SQL Reader的字符串问题?

时间:2008-10-02 00:29:15

标签: vb.net

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

3 个答案:

答案 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

您可以使用强制转换或转换,但使用两者都没有意义。