这个 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 并进行比较
解决方案: 我注意到我传递的变量 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 并进行比较