这个 SQL 命令有什么问题?

What is wrong with this SQL command?

解决方案: 我注意到我传递的变量 Username 的长度超过了 65k。这让我发现我将 ReceiveBufferSize 设置错了。这只有在我需要检查唯一值时才会变得明显,并且该值是流中的最后一个值。在我的 "working" 命令中,用户名是第二个命令。如果您处于类似情况,请使用 QuickWatch 并密切注意。可能是空格导致这些值不匹配。

Public Function Before_Logon(ByVal Username As String) As String
            Try
                mySqlCon.Open()
                Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT username FROM user WHERE username=@username", mySqlCon)
                sqlCommandPreLogon.Parameters.AddWithValue("@username", Username)
                Dim dr As MySqlDataReader = sqlCommandPreLogon.ExecuteReader()
                While dr.Read
                    Return dr.Item(0).ToString
                End While
            Catch ex As Exception
            End Try
            Return 6
        End Function

我在另一个函数中有一个类似这样的命令,它工作正常。这个找不到任何东西。删除 Try/Catch 显示没有错误。

这也不行。

 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='" & Username & "'", mySqlCon)

奇怪的是,这确实有效。

 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='user'", mySqlCon)

为什么 variables/sql 参数值不起作用,但这个有效?

更新:当我通过QuickWatch查看参数时,似乎没有任何问题。第一个是工作命令,第二个是不是。

test    {@uname}    MySql.Data.MySqlClient.MySqlParameter
BaseName    uname   String
Collection  {MySql.Data.MySqlClient.MySqlParameterCollection}   MySql.Data.MySqlClient.MySqlParameterCollection
DbType  String {16} System.Data.DbType
Direction   Input {1}   System.Data.ParameterDirection
Encoding    Nothing System.Text.Encoding
IsNullable  FALSE   Boolean
MySqlDbType VarChar {253}   MySql.Data.MySqlClient.MySqlDbType
ParameterName   @uname  String
PossibleValues  Nothing System.Collections.IList
Precision   0   Byte
Precision (DbParameter) 0   Byte
Scale   0   Byte
Scale (DbParameter) 0   Byte
Size    65533   Integer
SourceColumn    Nothing String
SourceColumnNullMapping FALSE   Boolean
SourceVersion   Current {512}   System.Data.DataRowVersion
TypeHasBeenSet  TRUE    Boolean
Value   new {String}    Object
String  new String
ValueObject {MySql.Data.Types.MySqlString}  MySql.Data.Types.IMySqlValue
MySql.Data.Types.MySqlString    {MySql.Data.Types.MySqlString}  MySql.Data.Types.MySqlString
IsNull  TRUE    Boolean
Value       String

test    {@uname}    MySql.Data.MySqlClient.MySqlParameter
BaseName    uname   String
Collection  {MySql.Data.MySqlClient.MySqlParameterCollection}   MySql.Data.MySqlClient.MySqlParameterCollection
DbType  String {16} System.Data.DbType
Direction   Input {1}   System.Data.ParameterDirection
Encoding    Nothing System.Text.Encoding
IsNullable  FALSE   Boolean
MySqlDbType VarChar {253}   MySql.Data.MySqlClient.MySqlDbType
ParameterName   @uname  String
PossibleValues  Nothing System.Collections.IList
Precision   0   Byte
Precision (DbParameter) 0   Byte
Scale   0   Byte
Scale (DbParameter) 0   Byte
Size    3   Integer
SourceColumn    Nothing String
SourceColumnNullMapping FALSE   Boolean
SourceVersion   Current {512}   System.Data.DataRowVersion
TypeHasBeenSet  TRUE    Boolean
Value   new {String}    Object
String  new String
ValueObject {MySql.Data.Types.MySqlString}  MySql.Data.Types.IMySqlValue
MySql.Data.Types.MySqlString    {MySql.Data.Types.MySqlString}  MySql.Data.Types.MySqlString
IsNull  TRUE    Boolean
Value       String

下面是'user'' & Username & '的区别顺序。

test    {@uname}    MySql.Data.MySqlClient.MySqlParameter
BaseName    uname   String
Collection  {MySql.Data.MySqlClient.MySqlParameterCollection}   MySql.Data.MySqlClient.MySqlParameterCollection
DbType  String {16} System.Data.DbType
Direction   Input {1}   System.Data.ParameterDirection
Encoding    Nothing System.Text.Encoding
IsNullable  FALSE   Boolean
MySqlDbType VarChar {253}   MySql.Data.MySqlClient.MySqlDbType
ParameterName   @uname  String
PossibleValues  Nothing System.Collections.IList
Precision   0   Byte
Precision (DbParameter) 0   Byte
Scale   0   Byte
Scale (DbParameter) 0   Byte
Size    65533   Integer
SourceColumn    Nothing String
SourceColumnNullMapping FALSE   Boolean
SourceVersion   Current {512}   System.Data.DataRowVersion
TypeHasBeenSet  TRUE    Boolean
Value   user {String}   Object
String  user    String
ValueObject {MySql.Data.Types.MySqlString}  MySql.Data.Types.IMySqlValue
MySql.Data.Types.MySqlString    {MySql.Data.Types.MySqlString}  MySql.Data.Types.MySqlString
IsNull  TRUE    Boolean
Value       String

test    {@uname}    MySql.Data.MySqlClient.MySqlParameter
BaseName    uname   String
Collection  {MySql.Data.MySqlClient.MySqlParameterCollection}   MySql.Data.MySqlClient.MySqlParameterCollection
DbType  String {16} System.Data.DbType
Direction   Input {1}   System.Data.ParameterDirection
Encoding    Nothing System.Text.Encoding
IsNullable  FALSE   Boolean
MySqlDbType VarChar {253}   MySql.Data.MySqlClient.MySqlDbType
ParameterName   @uname  String
PossibleValues  Nothing System.Collections.IList
Precision   0   Byte
Precision (DbParameter) 0   Byte
Scale   0   Byte
Scale (DbParameter) 0   Byte
Size    65533   Integer
SourceColumn    Nothing String
SourceColumnNullMapping FALSE   Boolean
SourceVersion   Current {512}   System.Data.DataRowVersion
TypeHasBeenSet  TRUE    Boolean
Value   user {String}   Object
String  user    String
ValueObject {MySql.Data.Types.MySqlString}  MySql.Data.Types.IMySqlValue
MySql.Data.Types.MySqlString    {MySql.Data.Types.MySqlString}  MySql.Data.Types.MySqlString
IsNull  TRUE    Boolean
Value       String

你说

这也不行。

 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='" & Username & "'", mySqlCon)

奇怪的是,这确实有效。

 Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT uid FROM user WHERE username='user'", mySqlCon)

那么这个怎么样

Dim sSql1 As String
Dim sSql2 As String

sSql1 = "SELECT uid FROM user WHERE username='" & Username & "'"
sSql2 = "SELECT uid FROM user WHERE username='user'"

并对 sSql1 和 sSql2 进行 QuickWatch 并进行比较