Вместо создания оператора SQL на клиенте вы можете вызвать хранимую процедуру и передать значения в DataTable
. В вашей хранимой процедуре присоединитесь к передаваемым значениям, что означает, что вам не нужно будет создавать длинный динамический SQL-оператор, и снизит риск атаки SQL-инъекцией.
Например, если вы создадите этот тип и процедуру в своей базе данных (я предполагаю, что здесь для типов данных):
create type dbo.OrderIdInfo as table
(
OrderId nvarchar(20)
)
create procedure dbo.SelectOrders
(
@orderIds dbo.OrderIdInfo readonly
)
as
select o.*
from OrderPickSheet o
inner join @orderIds i on o.OrderId = i.OrderId
where o.Status > -1
order by o.SortOrder
Вы можете вызвать процедуру, как показано ниже. Код работает (проверено в LINQPad), но VB не является моим основным языком, так что простите за неуклюжесть:
Dim table As New DataTable
Dim results As New DataTable
table.Columns.Add("OrderId", GetType(String))
table.Rows.Add("1")
table.Rows.Add("2")
table.Rows.Add("4")
Dim parameter As New SqlParameter("@orderIds", SqlDbType.Structured)
parameter.Value = table
Using connection As SqlConnection = New SqlConnection("server=localhost;database=Test;integrated security=true")
Using command As SqlCommand = connection.CreateCommand()
command.CommandText = "dbo.SelectOrders"
command.CommandType = CommandType.StoredProcedure
command.Parameters.Add(parameter)
connection.Open()
Dim reader As SqlDataReader = command.ExecuteReader()
results.Load(reader)
End Using
End Using