解決方案:我注意到我傳遞的變量的長度,用戶名超過65k。這導致我看到我設置ReceiveBufferSize錯誤。如果我需要檢查一個唯一值,這個值纔會變得明顯,並且該值是流中的最後一個值。在我的「工作」命令中,用戶名是第二個命令。如果您遇到類似情況,請使用QuickWatch並付出非常密切的關注。可能是導致這些值不匹配的空白。這條SQL命令有什麼問題?
Public Function Before_Logon(ByVal Username As String) As String
Try
mySqlCon.Open()
Dim sqlCommandPreLogon As MySqlCommand = New MySqlCommand("SELECT username FROM user WHERE [email protected]", 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)
爲什麼變量/ 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
定義 「不工作」。你的第一個例子是一個完全沒有意義的查詢,因爲你正在獲取一個你已經擁有*的值。你的第二個例子是一個明顯的SQL注入漏洞,不應該被使用。你的第三個例子根本不使用輸入值,只是使用硬編碼的值。你想要做什麼,失敗的方式是什麼? – David
它不起作用,因爲要執行的最終字符串是不同的或不合適的,如果將其保存爲字符串並通過調試進行檢查,很容易看出 – Drew
第一個示例可用於驗證名稱是否存在。但是,我真的在拉另一列。如果這不起作用,我默認了一些我知道工作的東西。當它工作時,我變得非常沮喪。顯然第二個例子是開放的SQL注入。例子二和三是測試。我開始使用參數,因爲這是您編寫它的唯一方法。 – user287848