0

ここで何が間違っているのかよくわかりません。テキスト ボックスから日付 (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 から始まる未知の単語があります

4

3 に答える 3

0

SQL の日付はDateTime形式ですが、ストアド プロシージャのパラメーターはDateデータ型です。このようにするには、パラメーターのデータ型を取得する必要がありますDateTime

@DateDisplay date
于 2013-10-22T11:01:56.917 に答える
0

ストアド プロシージャのエラーを指摘していただきありがとうございますが、本当の問題は、date_select テキスト ボックスを使用して、別のテキスト ボックスであるはずの価格を表示していたことです。ページに date_select テキスト ボックスの日付を使用するグラフがあるため、変更するとページ全体がクラッシュしました。これを修正しました。

于 2013-10-22T12:20:11.380 に答える
0

問題は SQL Server ではなく、.NET コードにあります

列をなして:

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)
于 2013-10-22T11:15:50.917 に答える