Visual Basic SQL команда не возвращает ничего переменным - PullRequest
0 голосов
/ 28 июня 2010

Я работаю над этим кодом, который собирается запросить в базе данных запись и вернуть значение номера отслеживания и время печати на этикетке, если номер отслеживания существует в базе данных. сейчас это не так, кажется, что только перепечатывается число, введенное в текстовое поле, и оно не захватывает дату. есть идеи? вот код.

    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 New SqlClient.SqlConnection(connectionString) 

    Dim cmd As New SqlClient.SqlCommand(cmdText, connection) 

    cmd.Parameters.AddWithValue("@TrackingNumber", TrNum) 
    cmd.Parameters.AddWithValue("@Date", TrDate) 

    connection.Open() 

    'this is where my print code begins and it works fine it just uses TrNum for the tracking number and TrDate for the date.

Вот мой отредактированный код с внесенными изменениями, я все ближе?

    Dim dupText
    Dim trackingNumber As String
    Dim dateSent

    dupText = Me.DupTNText

    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 New SqlClient.SqlConnection(connectionString)

        Dim cmd As New SqlClient.SqlCommand(cmdText, connection)

        cmd.Parameters.AddWithValue("@TrackingNumber", dupText)
        cmd.Parameters("@TrackingNumber").Direction = ParameterDirection.Input

        connection.Open()

        Dim sdr As SqlDataReader = cmd.ExecuteReader()

        If (sdr("TrackingNumber") IsNot Nothing) Then
            trackingNumber = Convert.ToString(sdr("TrackingNumber"))
            dateSent = Convert.ToString(sdr("Date"))
        End If

РЕДАКТИРОВАТЬ # 3

Изменения применены, я уверен, что теперь это строка запроса. я получаю

«Параметризованный запрос» (@TrackingNumber nvarchar (4000), @ Date datetime) SELECT TrackingNu «ожидает параметр« @TrackingNumber », который не был предоставлен».

со строкой, как показано ниже. Какую другую часть кода вам нужно увидеть, чтобы помочь определить проблему? Я чувствую, что я рядом, и спасибо, я многому научился от этого! извините также за изменение имен переменных.

Private Sub DupOKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DupOKButton.Click

    Dim dupText
    Dim trackingNumber As String
    Dim dateSent

    dupText = Me.DupTNText

    Dim connectionString As String = "Data Source=XXXXX;Initial Catalog=ScannedDB;Integrated Security=True;Pooling=False;Encrypt=False"

    Dim cmdText As String = "SELECT TrackingNumber, Date FROM[ScannedDBTable] WHERE TrackingNumber = @TrackingNumber AND Date = @Date"

    Using connection As New SqlClient.SqlConnection(connectionString)

        Dim cmd As New SqlClient.SqlCommand(cmdText, connection)

        cmd.Parameters.Add(CreateSqlParameter("@TrackingNumber", DbType.String, ParameterDirection.Input, trackingNumber))
        cmd.Parameters.Add(CreateSqlParameter("@Date", DbType.DateTime, ParameterDirection.Input, dateSent))

        connection.Open()

        Dim sdr As SqlDataReader = cmd.ExecuteReader()

        If (sdr("TrackingNumber") IsNot Nothing) Then
            trackingNumber = Convert.ToString(sdr("TrackingNumber"))
            dateSent = Convert.ToString(sdr("Date"))
        End If

'Printing code...

РЕДАКТИРОВАТЬ # 4

Private Sub DupOKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DupOKButton.Click


    Dim trackingNumber As String
    Dim dateSent As DateTime

    trackingNumber = Me.DupTNText.Text

    Dim connectionString As String = "Data Source=XXXXX;Initial Catalog=ScannedDB;Integrated Security=True;Pooling=False;Encrypt=False"

    Dim cmdText As String = "SELECT TrackingNumber, Date FROM[ScannedDBTable] WHERE TrackingNumber = @TrackingNumber AND Date = @Date"

    Using connection As New SqlClient.SqlConnection(connectionString)



        Dim cmd As New SqlClient.SqlCommand(cmdText, connection)

        cmd.Parameters.Add(CreateSqlParameter("@TrackingNumber", DbType.String, ParameterDirection.Input, trackingNumber))
        cmd.Parameters.Add(CreateSqlParameter("@Date", DbType.DateTime, ParameterDirection.Input, dateSent))

        connection.Open()

        Dim sdr As SqlDataReader = cmd.ExecuteReader()

        If (sdr("TrackingNumber") IsNot Nothing) Then
            trackingNumber = Convert.ToString(sdr("TrackingNumber"))
            dateSent = Convert.ToString(sdr("Date"))
        End If

РЕДАКТИРОВАТЬ # 5

Private Sub DupOKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DupOKButton.Click


    Dim trackingNumber As String
    Dim dateSent As DateTime

    trackingNumber = Me.DupTNText.Text

    Dim connectionString As String = "Data Source=XXXXX;Initial Catalog=ScannedDB;Integrated Security=True;Pooling=False;Encrypt=False"

    Dim cmdText As String = "SELECT TrackingNumber, [Date] FROM ScannedDBTable WHERE TrackingNumber = @TrackingNumber"

    Using connection As New SqlClient.SqlConnection(connectionString)

        Dim cmd As New SqlClient.SqlCommand(cmdText, connection)

        cmd.Parameters.Add(CreateSqlParameter("@TrackingNumber", DbType.String, ParameterDirection.Input, trackingNumber))
        'cmd.Parameters.Add(CreateSqlParameter("@Date", DbType.DateTime, ParameterDirection.Input, dateSent))

        connection.Open()

        Dim sdr As SqlDataReader = cmd.ExecuteReader()

        If (sdr("TrackingNumber") IsNot Nothing) Then
            trackingNumber = Convert.ToString(sdr("TrackingNumber"))
            dateSent = Convert.ToString(sdr("Date"))
        Else
        End If

Ответы [ 3 ]

2 голосов
/ 28 июня 2010
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.Но опять же, только вы знаете, нужен ли вам этот параметр или нет.Но поскольку вы не придаете этому никакого значения, мне кажется, вам это не нужно.

1 голос
/ 28 июня 2010

Убедитесь, что вы установили свойство direction для вашего объекта параметра

myParm.Direction = ParameterDirection.Output;

или

myParm.Direction = ParameterDirection.ReturnValue;
1 голос
/ 28 июня 2010

Во-первых, эта строка здесь:

cmd.Parameters.AddWithValue("@Date", TrDate)

Устанавливает параметр @Date в запросе в значение TrDate. Он не вытягивает значение в TrDate.

Во-вторых, я не вижу, где вы на самом деле вызываете cmd.Execute() и извлекаете набор результатов, это далее в коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...