不太确定我在这里做错了什么。我有一个文本框中的字符串,这是一个日期(2013年10月22日),我想用它来使用存储过程从SQL DB中选择一个值。
VB代码是:
'gets the values for the daily prices from DB if they exist.
Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Optimiser_TestConnectionString").ConnectionString)
conn.Open()
Using cmd As SqlCommand = conn.CreateCommand
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "get_dailypricing"
cmd.Parameters.Add("@datedisplay", SqlDbType.DateTime).Value = date_select.Text
Dim sqlrd As SqlDataReader = cmd.ExecuteReader
If sqlrd.HasRows Then
sqlrd.Read()
Me.date_select.Text = sqlrd.Item("price")
Else
Me.date_select.Text = "N/A"
End If
End Using
End Using
存储过程是:
ALTER procedure [dbo].[get_dailypricing]
@DateDisplay date
AS
Begin
select price
from dailyPricing
where dateSubmitted = @DateDisplay
end
我正在使用Visual Studio 2012和SQL Server 2012.SQL Server中的日期类型为datetime
,格式为2013-10-22 11:37:49.727
我收到错误
字符串未被识别为有效的DateTime。从索引0开始有一个未知单词
答案 0 :(得分:0)
您在SQL中的日期是DateTime
格式,但您的存储过程参数是Date
数据类型。
您需要将参数数据类型设置为DateTime
,如下所示。
@DateDisplay date
答案 1 :(得分:0)
问题在于您的.NET代码,而不是SQL Server
排队:
cmd.Parameters.Add("@datedisplay", SqlDbType.DateTime).Value = date_select.Text
您将日期值作为字符串而不是DateTime对象传递。 .NET将尝试使用当前线程的文化来解析此字符串,这可能无法解析用户的输入。
您应该在自己解析之前验证用户的字符串,然后将解析后的值传递给存储过程。更好的是,使用类似DatePicker的控件只返回有效地址。
假设您确实想使用该线程的语言环境,您应该使用以下代码:
Dim theDate=DateTime.Parse(date_select.Text)
cmd.Parameters.AddWithValue("@datedisplay",theDate)
更安全的选择是要求用户以特定格式输入文本,然后使用此格式进行解析。假设您希望用户使用InvariantCulture,您应该写:
Dim theDate=DateTime.Parse(date_select.Text,CultureInfo.InvariantCulture)
cmd.Parameters.AddWithValue("@datedisplay",theDate)
答案 2 :(得分:0)
感谢指出我的存储过程中的错误,但真正的问题是我使用date_select文本框来显示应该是另一个文本框的价格。我在页面上有一个图表,它使用date_select文本框中的日期,所以当它改变整个页面崩溃时。我现在已经解决了这个问题。