2017-01-18 22 views
1

私はdatetimepickerを含むwinformアプリケーションを持っています。日付を選択すると、その日付の販売詳細が表示されます。ロードイベントのフォームにもコードを追加しましたが、SqlDateTimeオーバーフローエラーが発生します。 1/1/1753 12:00:00 AMと12/31/9999 11:59:59 PMの間である必要があります。例外使用時

私のコードは

DateTime fromDate, toDate; 
      DateTime.TryParse(dateTimePicker_FromByDateSaleReport.Text, out fromDate); 
      DateTime.TryParse(dateTimePicker_ToByDateSaleReport.Text, out toDate); 


      SqlDataAdapter da3 = new SqlDataAdapter("SELECT Bill_Date,Name,Item,Item_Code,MRP, Quantity,Amount as Total, Amount_After_Discount as Grand_Total From POS LEFT JOIN Customers ON POS.Customer=Customers.Customer_Id WHERE Bill_Date Between @From AND @To", con); 
      da3.SelectCommand.Parameters.AddWithValue("@From", SqlDbType.DateTime).Value = fromDate; 
      da3.SelectCommand.Parameters.AddWithValue("@To", SqlDbType.DateTime).Value = toDate; 
      DataTable dt3 = new DataTable(); 
      da3.Fill(dt); 
      dgv_ByDateSaleReport.DataSource = dt3; 
     } 

です。

+0

をあなたは –

+0

のparams日にnullを渡すかもしれないが、あなたの出力dateTimePicker_FromByDateSaleReport.Textしましたか?それは何と言いますか?それにはどの日付形式が含まれていますか? – Tyron78

+0

ピッカーから値を解析する必要はありません。[値](https://msdn.microsoft.com/en-us/library/system.windows.forms.datetimepicker)で取得できます。値(v = 1.10).aspx)プロパティ。それが問題だとは思わないが、助けになるかもしれない。 –

答えて

1

これは、fromDatetoDateの値が適切に解析されていないため、元のデフォルト値「1/1/0001 12:00:00 AM」を含む可能性があります。これは有効な日付ではありません:

DateTime fromDate, toDate; 
DateTime.TryParse(dateTimePicker_FromByDateSaleReport.Text, out fromDate); 
DateTime.TryParse(dateTimePicker_ToByDateSaleReport.Text, out toDate); 

あなたがたDateTimeピッカーコントロールを使用している場合は、実際のDateTimeオブジェクトを返しますDateTimePicker.Value propertyを、使用して日付にアクセスする可能性の高いことができます:

DateTime fromDate = dateTimePicker_FromBydateSaleReport.Value; 
DateTime toDate = dateTimePicker_ToByDateSaleReport.Value; 
3

これは、1つのために発生する可能性がありますまず

fromDateまたはtoDateのいずれかがその範囲外である、または(最も可能性が高い):

あなたの日付変数(fromDateまたはtoDateのいずれか)の一つは、TryParse()で解析することができなかった二つの理由の。この場合、日付はデフォルトのC#の値0001-01-01に設定されます。

SQL ServerDATETIMEデータ型のみ1753-01-01から9999-12-31に値を保持することができ、そして渡された0001-01-01が範囲外です。

実行前に解析されている文字列の値を確認してください。

+2

また、文字列の値をまったく使用しないで、ピッカーが[直接あなたに与える] DateTimeを取得してください(https://msdn.microsoft.com/en-us/library/system.windows。 forms.datetimepicker.value(v = vs.110).aspx)!ちょっとした精神的なデバッグ;) –

0

まあ、SqlDbType.DateTimeは、1753年1月1日から9999年12月31日までの値を持つため、代わりにSqlDbType.DateTime2を使用してください。
DateTimeのプロパティはValueという名前のDateTimeプロパティを既に持っているため、DateTimePicker.Textプロパティの解析ポイントもありません。

代わりにこれを試してみてください:

 SqlDataAdapter da3 = new SqlDataAdapter("SELECT Bill_Date,Name,Item,Item_Code,MRP, Quantity,Amount as Total, Amount_After_Discount as Grand_Total From POS LEFT JOIN Customers ON POS.Customer=Customers.Customer_Id WHERE Bill_Date Between @From AND @To", con); 
     da3.SelectCommand.Parameters.Add("@From", SqlDbType.DateTime2).Value = dateTimePicker_FromByDateSaleReport.Value; 
     da3.SelectCommand.Parameters.Add("@To", SqlDbType.DateTime2).Value = dateTimePicker_ToByDateSaleReport.Value; 
     DataTable dt3 = new DataTable(); 
     da3.Fill(dt); 
     dgv_ByDateSaleReport.DataSource = dt3; 
+0

私は、datetime型の列にcmd4.Parameters.AddWithValue( "@ BillDate"、dateTimePicker_POS.Text)というパラメータを挿入することができます。エラーメッセージ "文字列から日付や時刻を変換すると変換に失敗しました"というエラーメッセージが表示される – Abhijith

+0

'AddWithValue'を使用している場所が' Add'に変更されているのを確認できませんでした。とにかく、もっと重要なことは、 'Value'プロパティを持っているので' Text'プロパティを全く使う必要がないことです。ありがとう。 –

+0

Valueプロパティは私を少し助けました! – Abhijith