2015-12-04 62 views
-1

解決方案:我注意到我傳遞的變量的長度,用戶名超過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 
+2

定義 「不工作」。你的第一個例子是一個完全沒有意義的查詢,因爲你正在獲取一個你已經擁有*的值。你的第二個例子是一個明顯的SQL注入漏洞,不應該被使用。你的第三個例子根本不使用輸入值,只是使用硬編碼的值。你想要做什麼,失敗的方式是什麼? – David

+1

它不起作用,因爲要執行的最終字符串是不同的或不合適的,如果將其保存爲字符串並通過調試進行檢查,很容易看出 – Drew

+0

第一個示例可用於驗證名稱是否存在。但是,我真的在拉另一列。如果這不起作用,我默認了一些我知道工作的東西。當它工作時,我變得非常沮喪。顯然第二個例子是開放的SQL注入。例子二和三是測試。我開始使用參數,因爲這是您編寫它的唯一方法。 – user287848

回答

1

你說

這無論是簡化版,工作。

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快速監視和比較它們

+0

根據要求更新。 – user287848

+0

第一套,唯一的不同是尺寸。在這個集合中,所有的值都是相同的。至少,根據Excel(如果值重複,則應用填充)。 – user287848

+1

其中是sSql1和sSql2上的quickwatch。我沒有看到它,我就走另一個問題 – Drew