【问题标题】:Visual basic sql command not returning anything to variablesVisual basic sql命令不向变量返回任何内容
【发布时间】:2010-06-28 18:26:20
【问题描述】:

我正在编写此代码,该代码将在数据库中查询条目并返回跟踪号的值以及在数据库中存在跟踪号时在标签上打印的时间。它现在不是,它似乎只是重新打印在文本框中输入的数字并且它没有获取日期。有任何想法吗?这是代码。

    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

【问题讨论】:

  • 你是否调用了cmd.ExecuteReader() 方法?
  • @Will Marcouiller 这是我所做的一些更改
  • 在您的代码中,您没有为变量dupTextdateSent 提供任何数据类型。这可能会在转换时导致 null(无)值,因此这会抱怨未提供参数。另外,它似乎正在监视两个 nvarchar(4000) 数据类型作为参数,因此将您的 SqlParameter.DbType 更改为适当的类型并进行测试。尝试使用QuickWatch 来查看在对数据库执行查询之前会发生什么。
  • @Will Marcouiller 我不确定 dupText 的数据类型,因为它从文本框中提取条目,因此字符串不起作用并且文本太模糊,我将 dateent 更改为 DateTime,现在可以看到正确的数据类型。我使用了快速启动,它确实因为空值而出错。我修改了我的代码并将其发布在上面。我想我是错的。如果我可以将文本框中的条目转换为字符串并使用上面的代码,我想我就在那里。唯一的问题是,这还有可能吗?
  • TextBox.Text 属性是 String 类型的。 dateSent 变量值应该通过DateTimePicker 控件选择,如果您要使用 WinForms。然后,您的 DateTimePicker.ValueDateTime 类型。所以,你的dateSent 变量应该是DateTime。然而,您应该首先考虑您的数据表列数据类型,因为这是 RDBMS 必须处理的问题。好像在等nvarchar(4000),所以试试DbType.String

标签: sql vb.net visual-studio-2010


【解决方案1】:
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 区域设置进行完全格式控制,否则您不必使用 DateTime.Parse

编辑#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 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。”是不是因为我只输入一个跟踪号并要求一个跟踪号以及日期和时间而感到困惑?

是的,它在某种程度上变得混乱。不可为空的 DateTime 数据类型的默认值为:

Dim dateSent As DateTime

根据关于DateTime Structure 的MSDN 参考,dateSent 已经有一个值01, January 0001 00:00:00.000 AM。由于 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 参数。但话又说回来,只有你知道你是否需要这个参数。但是由于您没有为它提供任何价值,所以在我看来您不需要它。

【讨论】:

  • @Will Marcouiller 谢谢!那么 sdr 如何将跟踪号和日期提供给单独的变量呢?我问的原因是让打印机打印我所要做的就是将跟踪号和日期的变量名放在变量名中。
  • @Will Marcouiller 再次感谢!而且我不需要完全控制区域设置。你帮了大忙!此代码将替换下面的代码,对吗? If (sdr.HasRows) Then _ While (sdr.Read()) '' 打印数据 Console.WriteLine(String.Format("Track#: {0}, Date: {1}" _ , Convert.ToString(sdr( "TrackingNumber")) _ , DateTime.Parse(Convert.ToString(sdr("Date")), New CultureInfo("en-Us")) End While
  • @0bfus:是的,您可以在此处为获得的 TrackingNumber 和 Date 的结果设置变量。考虑到可能需要执行一些Nothing 处理以避免一些类型转换错误,但这应该没问题。
  • @Will Marcouiller 我添加了新代码的粗略以及建议的更改。你会看一下吗?
  • @Will Marcouiller 我尝试运行 tha bove 代码,但它挂在“Dim sdr As SqlDataReader = cmd.ExecuteReader()”行。它给出了“','附近的语法错误”。错误。有什么想法吗?
【解决方案2】:

首先,这里的这一行:

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

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

其次,我看不到您实际调用cmd.Execute() 并检索结果集的位置,这是代码中的进一步内容吗?

【讨论】:

  • @Date 是正确的,但是我猜 SQL SELECT 语句是通过选择 Date 数据列来实现的。 =)
  • 那么你如何将@Date 拉入TrDate 呢?根据Visual Studio, cmd.execute() 也不是 system.data.sqlclcient.sqlcommand 的一部分
  • @0bfus: cmd.Execute() 不是,但cmd.ExecuteQuery() 是。
  • @Will Marcouiller 它仍然无法识别 .executequery()。除了导入 system.data.sqlclient,我还需要什么?
  • @0bfus:我的错,对不起!是cmd.ExecuteReader()
【解决方案3】:

确保在参数对象上设置了方向属性

myParm.Direction = ParameterDirection.Output;

myParm.Direction = ParameterDirection.ReturnValue;

【讨论】:

  • +1 参数方向确实需要注意。谢谢! =)
  • 在您的情况下,它看起来像这样。 cmd.Parameters["@TrackingNumber"].Direction = ParameterDirection.Output;
  • 我还建议您将命令文本移动到存储过程中,并声明输出参数。
猜你喜欢
  • 2021-06-10
  • 2013-08-27
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多