2015-10-16 57 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

相关问题