Dim TrNum As String = Me.DupTNText.Text
Dim TrDate As <=something if it is even needed
Dim connectionString As String = "Data Source=XXXXX;Initial Catalog=YYYYY;Integrated Security=True;Pooling=False;Encrypt=False"
Dim cmdText As String = "SELECT TrackingNumber, Date " & _
"FROM YYYYY " & _
"WHERE TrackingNumber = @TrackingNumber, Date = @Date"
Using connection As SqlConnection = New SqlClient.SqlConnection(connectionString)
Using cmd As SqlCommand = New SqlClient.SqlCommand(cmdText, connection)
cmd.Parameters.AddWithValue("@TrackingNumber", TrNum)
cmd.Parameters.AddWithValue("@Date", TrDate)
cmd.Parameters("@TrackingNumber").Direction = ParameterDirection.Input
cmd.Parameters("@Date").Direction = ParameterDirection.Input
connection.Open()
Dim sdr As SqlDataReader = cmd.ExecuteReader();
If (sdr.HasRows) Then _
While (sdr.Read())
'' Printing data
Console.WriteLine(String.Format("Track#: {0}, Date: {1}" _
, Convert.ToString(sdr("TrackingNumber")) _
, DateTime.Parse(Convert.ToString(sdr("Date")), New CultureInfo("en-Us"))
End While
End Using
End Using
Отказ от ответственности: Этот код не был протестирован и предоставляется как есть, просто чтобы продемонстрировать идею, которая, будем надеяться, поможет вам найти решение.
Пожалуйста, см. SqlCommand.ExecuteReader Method
для получения дополнительной информации по теме.
РЕДАКТИРОВАТЬ # 1
какБудет ли SDR передавать номер отслеживания и дату для разделения переменных?
Вы бы просто указали свои переменные следующим образом:
' Assuming you have already declared your variables here...'
If (sdr("TrackingNumber") IsNot Nothing) Then
trackingNumber = Convert.ToString(sdr("TrackingNumber"))
dateSent = DateTime.Parse(Convert.ToString(sdr("Date")), New CultureInfo("en-CA"))
End If
Это всего лишь пример.Вам не нужно использовать DateTime.Parse
, если вы не хотите полностью управлять форматом ваших DateTime
региональных настроек.
РЕДАКТИРОВАТЬ # 2
@dretzlaff17, куда это пойдет?(говоря о перечислении ParameterDirection)
Вы бы поместили его именно там, где вы вызываете метод Parameters.AddWithValue()
.Вместо того, чтобы вызывать метод, как вы это делаете на самом деле, вы также можете сделать следующее:
Dim trackingNumberParameter As SqlParameter = New SqlParameter()
trackingNumberParameter.ParameterName = "@TrackingNumber"
trackingNumberParameter.Direction = ParameterDirection.Input
trackingNumberParameter.Value = TrNum
cmd.Parameters.Add(trackingNumberParameter)
Dim dateParameter As SqlParameter = New SqlParameter()
...
cmd.Parameters.Add(dateParameter)
Или даже так, что может лучше подойти вашему коду:
cmd.Parameters("@TrackingNumber").Direction = ParameterDirection.Input
Посмотрите мой пример кода с перечислением ParameterDirection выше (исходный пример).
РЕДАКТИРОВАТЬ # 3
"Параметризованный запрос" (@TrackingNumber nvarchar (4000), @ Date nvarchar (4000)) SELECT (@Tr 'ожидает параметр "@TrackingNumber", который не был предоставлен. ", Когда запрос имеет значение" SELECT (@TrackingNumber) FROM [XXXXX] WHERE TrackingNumber = @TrackingNumber "
На первый взгляд кажется, что типы данных неправильные. Я могу ошибаться, поскольку не знаю ваш код.
Если это так, вы можететакже предоставьте DbType
ваших параметров.
cmd.Parameters("@TrackingNumber").DbType = SqlDbType.String
cmd.Parameters("@Date").DbType = SqlDbType.DateTime ' If the data column is indeed a DateTime data type.
Но то, что я хотел бы сделать, чтобы убедиться, что я предоставил параметры соответственно, это то, что я написал в EDIT #2 , то есть первый раздел при объявлении и создании модулейзначения SqlParameter
для обоих параметров и указание их соответствующего типа данных через свойство DbType
.(См. SqlParameter Members для более подробной информации).Возможно, вспомогательный метод мог бы выполнить эту работу за вас, как вы можете сделать то же самое и с другими запросами.
Public Function CreateSqlParameter(ByVal name As String, ByVal dbType As DbType, ByVal direction As ParameterDirection, ByVal value As Object) As SqlParameter
Dim parameter As SqlParameter = New SqlParameter()
parameter.ParameterName = name
parameter.DbType = dbType
parameter.Direction = direction
parameter.Value = value
Return parameter
End Function
И затем создать их в своем коде:
cmd.Parameters.Add(CreateSqlParameter("@TrackingNumber", DbType.String, ParameterDirection.Input, TrNum))
cmd.Parameters.Add(CreateSqlParameter("@Date", DbType.DateTime, ParameterDirection.Input, TrDate))
Neverhelss, проверьте InnerException, так как он может предоставить более подробную информацию об ошибке.По крайней мере, я могу сказать, что вы прогрессировали.
РЕДАКТИРОВАТЬ # 4
Возможно, это может помочь: The parameterized query ... expects the parameter ..., which was not supplied.
РЕДАКТИРОВАТЬ # 5
"Переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.12.9999 11:59:59 PM«.Это сбивается с толку, потому что я только набираю номер для отслеживания и запрашиваю номер для отслеживания, а также дату и время?
Да, это как-то запутывается.Значение по умолчанию для типа данных DateTime без значения NULL:
Dim dateSent As DateTime
dateSent уже имеет значение, равное 01, January 0001 00:00:00.000 AM
согласно справке MSDN о DateTime Structure
.Поскольку тип данных SQL Server DateTime охватывает период, указанный в сообщении об ошибке, переменная @dateSent
DateTime не может быть более ранней, чем 1/1/1753 12:00:00 AM
, она жалуется на значение вне диапазона.
Если вы этого не сделаетеПохоже, что параметр DateTime обязателен, просто удалите его из запроса и вычтите код, добавив этот параметр в переменную cmd
.Используйте только то, что вам необходимо для получения необходимой информации.Если это номер отслеживания, используйте только параметр @TrackingNumber
.Итак, ваш SQL DQL может выглядеть так:
select TrackingNumber
, [Date]
from YYYYY
where TrackingNumber = @TrackingNumber
Тогда больше не будет необходимости в параметре @Date.Но опять же, только вы знаете, нужен ли вам этот параметр или нет.Но поскольку вы не придаете этому никакого значения, мне кажется, вам это не нужно.