使用datetime通过存储过程将字符串传递给SQL

时间:2013-10-22 10:58:27

标签: sql sql-server vb.net

不太确定我在这里做错了什么。我有一个文本框中的字符串,这是一个日期(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开始有一个未知单词

3 个答案:

答案 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文本框中的日期,所以当它改变整个页面崩溃时。我现在已经解决了这个问题。