2015-10-16 6 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-инъекции и должен быть исправлен.

Extra - Вот линия, которая делает чтение:

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

Смежные вопросы