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