【问题标题】:passing a string through to SQL via stored procedure using datetime [duplicate]使用日期时间通过存储过程将字符串传递给 SQL [重复]
【发布时间】:2013-10-22 20:20:11
【问题描述】:

不太确定我在这里做错了什么。我有一个来自文本框中的字符串,它是一个日期 (22/10/2013),我想使用它使用存储过程从 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

我收到一个错误

字符串未被识别为有效的日期时间。从索引 0 开始有一个未知单词

【问题讨论】:

  • 如果你用谷歌搜索你得到的错误,那么这个问题和答案就没有尽头。 linklinklink

标签: sql sql-server vb.net


【解决方案1】:

您在 SQL 中的日期是 DateTime 格式,但您的存储过程参数是 Date 数据类型。 您需要像这样将参数数据类型转换为DateTime

@DateDisplay date

【讨论】:

    【解决方案2】:

    问题出在您的 .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)
    

    【讨论】:

      【解决方案3】:

      感谢指出我的存储过程中的错误,但真正的问题是我使用 date_select 文本框来显示价格,而它应该是另一个文本框。我在页面上有一个图表,它使用 date_select 文本框中的日期,所以当它更改时,整个页面都崩溃了。我现在已经解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多