У меня есть этот код
UPDATE OPENQUERY (db,'SELECT * FROM table WHERE ref = ''"+ Ref +"'' AND bookno = ''"+ Session("number") +"'' ')
Как бы я предотвратить SQL-инъекции на этом?
UPDATE
Вот что я пытаюсь
SqlCommand cmd = new SqlCommand("Select * from Table where ref=@ref", con);
cmd.Parameters.AddWithValue("@ref", 34);
По какой-то причине все, что я пытаюсь добавить, кажется, не работает, я продолжаю получать SQL Command
, упомянутый ниже.
Ошибка такая
'SqlCommand' is a type and cannot be used as an expression
Я беру на себя чужую работу, так что это все для меня в новинку, и я хотел бы поступить правильно, поэтому, если кто-то может предоставить дополнительную помощь о том, как сделать мой запрос выше защищенным от SQL-инъекций, тогда, пожалуйста.
ОБНОВЛЕНИЕ № 2
Я добавил в коде, как VasilP сказал, как это
Dim dbQuery As [String] = "SELECT * FROM table WHERE ref = '" & Tools.SQLSafeString(Ref) & "' AND bookno = '" & Tools.SQLSafeString(Session("number")) & "'"
Но я получаю сообщение об ошибке Tools is not declared
мне нужно указать определенное пространство имен, чтобы оно работало?
UPDATE
У кого-нибудь есть идеи, как лучше защитить мой запрос от внедрения SQL без ошибок, с которыми я сталкиваюсь?
UPDATE
Теперь он у меня есть, поэтому он работает без параметров. Вот мой обновленный исходный код. Есть идеи, почему он не добавляет значение параметра?
Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = @investor ') ", conn)
query.Parameters.AddWithValue("@investor", 69836)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
Работает так
Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = 69836') ", conn)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
Ошибка, которую я получаю, это
An error occurred while preparing a query for execution against OLE DB provider 'MSDASQL'.
И это потому, что он не заменяет @investor
на 69836
Есть идеи?
РЕШЕНИЕ
Вот как я решил свою проблему
Dim conn As SqlConnection = New SqlConnection("server='h'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()
Dim query As New SqlCommand("DECLARE @investor varchar(10), @sql varchar(1000) Select @investor = 69836 select @sql = 'SELECT * FROM OPENQUERY(db,''SELECT * FROM table WHERE investor = ''''' + @investor + ''''''')' EXEC(@sql)", conn)
dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()
Теперь я могу писать запросы, не беспокоясь о внедрении SQL