2015-10-16 99 views
1

我接手一個VB項目,並用我有限的VB技能我不能讓下面的參數化查詢返回的結果:爲什麼這個參數化的sql查詢不返回結果?

Dim strSQLUser As String = "Select Name, CompanyID from Users where UserName = @UserName" 
dbCommand = New SqlCommand(strSQLUser, dbConn) 
dbCommand.Parameters.AddWithValue("@UserName", User) 
dr = dbCommand.ExecuteReader 

然而,這是不工作的原代碼:

Dim strSQLUser As String = "Select Name, CompanyID from Users where UserName ='" & User & "'" 
dbCommand = New SqlCommand(strSQLUser, dbConn) 
dr = dbCommand.ExecuteReader 

正如您所看到的,原始代碼容易受到sql注入攻擊,需要修復。

額外 - 這裏是不讀行:

While dr.Read 
    DbUser = dr.GetValue(0).ToString 
    DbCompany = dr.GetValue(1).ToString 
End While 
+1

我想這個變量User是一個字符串吧? – Steve

回答

1

當使用參數不指定引號參數'。所有參數自動轉換爲各自的列類型,如日期,nvarchar等,因此不再引用。

Dim strSQLUser As String = "Select Name, CompanyID from Users where UserName [email protected]" 
+0

我在發佈問題之前就這麼想過,並試用過,沒有任何結果。 – Nightwolf

+0

我已經添加了問題的更新版本,因爲問題仍然沒有解決,即使您確實指出了一個錯誤。 – Nightwolf

+0

似乎出於某種奇怪的原因,在'= @'符號 – Nightwolf

2

嘗試這種情況:

Dim strSQLUser As String = "Select Name, CompanyID from Users where UserName [email protected]" 
dbCommand = New SqlCommand(strSQLUser, dbConn) 
dbCommand.Parameters.AddWithValue("@UserName", User.Text) 
dr = dbCommand.ExecuteReader 

另外更好的方法是提供價值爲:

dbCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = User.Text 

假設用戶是VARCHAR即文本類型。

+0

感謝您的回答,似乎我有'= @'有空格的錯誤,因爲哈拉曼先給出了正確的答案,我會將其標記爲正確。 – Nightwolf

+0

@Nightwolf: - 沒問題,還有提醒,請檢查提供的參數的正確方法,我在答覆中添加了這些參數。你的方式不建議。是的,=和@之間的空間並不重要。 –

+0

我曾嘗試'SqlDbType.VarChar',但不知道你不必提供長度,並認爲這可能是查詢失敗的原因。我會使用你的建議。 – Nightwolf

相關問題