【问题标题】:String problem with SQL Reader?SQL阅读器的字符串问题?
【发布时间】:2008-10-02 22:02:48
【问题描述】:
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。可以看到,右边没有引号,不知道为什么。顺便说一下,数据数据库中用户密码的类型是 BINARY。希望你能帮我解决这个问题。谢谢..x_x

【问题讨论】:

  • 我希望这不是你工作中数据库的真实密码 0_o
  • 您遇到了什么错误?这是在编译时还是运行时发生的? “如您所见,右边没有问号”是什么意思?
  • Danimal-->> 抱歉,我已经编辑了文本。-sef

标签: vb.net


【解决方案1】:

永远不要在数据库中存储实际密码。现在看起来您的密码可能由于转换/转换操作而不是纯文本,但您仍然遇到问题。至少使用的任何加密都是很容易逆转的,如果您的 sql 服务器最终位于与应用程序不同的机器上,那么密码将以纯文本形式通过网络传输。

如果您必须这样做(可能是因为旧系统或上面的授权),那么至少在服务器上进行匹配,这样密码就永远不会回来了到应用程序。

应该做的是使用类似 SQL Server 2005 的 HashBytes() 函数来仅存储实际密码的哈希值。当有人尝试登录时,对他们尝试的密码进行哈希处理并匹配哈希值。

至于您的具体问题,我的猜测是转换或转换操作失败导致 NULL 值返回到应用程序。你有 both 一个 CAST() 一个 CONVERT() 到相同的类型吗?这是多余的。

【讨论】:

    【解决方案2】:

    可以吗

    as varchar) as 'userpassword'
    

    应该是

    ...as varchar) as [userpassword] ..
    

    ...as varchar) as userpassword ..
    

    【讨论】:

      【解决方案3】:

      @Oglester 是对的,它是 'userpassword' 周围的单引号。

      这不是错误,只是很愚蠢:

       cast(convert(varchar,userpassword) as varchar
      

      您可以使用 cast 或 convert ,但两者都使用没有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        相关资源
        最近更新 更多