Visual Basic sql命令没有向变量返回任何内容

时间:2010-06-28 18:26:20

标签: sql vb.net visual-studio-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 个答案:

答案 0 :(得分:2)

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.

但我要做的是确保我分别提供参数,这是我在编辑#2 中写的,也就是说,在声明和创建{{1}的实例时的第一部分两个参数,并通过DbType属性指定各自的数据类型。 (有关详细信息,请参阅SqlParameter Members)。也许辅助方法可以为您完成这项工作,因为您可能也希望对其他查询也这样做。

SqlParameter

然后在代码中创建它们:

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

Neverhelss,检查InnerException,因为它可能会提供有关错误的更多详细信息。我至少可以说你已经取得了进步。

编辑#4

也许这可能会有所帮助:The parameterized query ... expects the parameter ..., which was not supplied.

编辑#5

  

“SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。”它是否变得混乱,因为我只输入跟踪号码并要求跟踪号码和日期和时间?

是的,它有点混乱。不可为空的DateTime数据类型的defaut值为:

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

根据有关DateTime Structure的MSDN参考,dateSent的值已为Dim dateSent As DateTime 。由于SQL Server DateTime数据类型涵盖错误消息中指定的时间段,01, January 0001 00:00:00.000 AM DateTime变量不能早于@dateSent,它会抱怨值超出范围。

如果您不想使用DateTime参数,只需将其从查询中删除,然后减去将此参数添加到1/1/1753 12:00:00 AM变量的代码。仅使用您所需的信息获取所需信息。如果这是跟踪号,则仅使用cmd参数。因此,您的SQL DQL可能如下所示:

@TrackingNumber

然后,将不再需要@Date参数。但话说回来,只有你知道你是否需要这个参数。但由于你没有提供任何价值,在我看来你不需要它。

答案 1 :(得分:1)

首先,这一行在这里:

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

将查询中的@Date参数设置为TrDate的值。它不会将值提取到TrDate

其次,我无法看到您实际调用cmd.Execute()的位置并检索结果集,代码中是否还有其他内容?

答案 2 :(得分:1)

确保在参数对象

上设置direction属性
myParm.Direction = ParameterDirection.Output;

myParm.Direction = ParameterDirection.ReturnValue;