2017-05-08 3 views
1

C#ASP.NETアプリケーション(MVC 3)からSQL Server 2014ストアドプロシージャを実行しているときに問題が発生しています。 同じパラメータでこの手順を手動で実行すると、すべて適切な結果が返されます。プロシージャがC#アプリケーションから実行されると、 "reader"は何もデータなしで空になります。これはDateTime形式の問題です。それを解決するために私は何をすべきですか?ここ はコードです:StoredProcedureのDateTime形式の問題 - C#ASP.NET x MS SQL Server 2014

SQL:

ALTER PROCEDURE [dbo].[my_proc] 
(
    @client_code AS varchar(7), 
    @begin_date AS datetime, 
    @end_date AS datetime 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 


SELECT * 
    from [dbo].[my_table] c 
    WHERE c.code = @client_code 
    AND c.date1 >= @begin_date 
    AND c.date2 <= @end_date 

END 

のC#:

DateTime Today = DateTime.Today; 
DateTime LastYear = Today.AddYears(-1); 
sql = new SqlConnection(/*my string connection*/); 
sql.Open(); 
adapter.SelectCommand = new SqlCommand(); 
adapter.SelectCommand.CommandText = "dbo.my_proc"; 
adapter.SelectCommand.Connection = sql; 
adapter.SelectCommand.CommandType = CommandType.StoredProcedure; 

param1 = adapter.SelectCommand.Parameters.Add("@client_code", SqlDbType.VarChar); 
param1.Value = cod_client; 

param2 = adapter.SelectCommand.Parameters.Add("@begin_date", SqlDbType.Date); 
param2.Value = LastYear.ToString("yyyy-MM-dd"); 

param3 = adapter.SelectCommand.Parameters.Add("@end_date", SqlDbType.Date); 
param3.Value = Today.ToString("yyyy-MM-dd"); 

reader = adapter.SelectCommand.ExecuteReader(); 
+1

'.ToString( "...")'?いいえ、問題があります。 'SqlDbType.DateTime'を使い、時刻部分を削除したい場合は' Today.Date'を使います。 –

+0

DateTime型のパラメータが期待されますが、完璧なdatetime変数を文字列に変換するのはなぜですか? – Steve

+0

C#とSQL Serverの日時フォーマットの不一致を恐れていたので、toStringメソッドでフォーマットを管理しようとしました。 –

答えて

1

あなたは文字列にDateTimeを変換するべきではありません。ストアドプロシージャにそのまま "そのまま"渡してください。日付部分だけを使用したい場合は、Dateを使用してください。データ型を変更しないでください。

param2 = adapter.SelectCommand.Parameters.Add("@begin_date", SqlDbType.Date); 
param2.Value = LastYear.Date; 

param3 = adapter.SelectCommand.Parameters.Add("@end_date", SqlDbType.Date); 
param3.Value = Today.Date; 
+0

私はこの方法で試しましたが、期待どおりに動作していません。私はdatetime形式の不一致を恐れています。 –

+0

私はこの方法を長い間使っています。何が間違っているか説明してください? – David

+0

C#アプリケーションから実行すると、プロシージャは空に戻ります。ただし、同じパラメータを使用してSQL Serverからプロシージャを直接手動で実行すると、すべての適切な行が返されます。 –

0

AddWithValue法ウィッヒはそれほど冗長で、その場でパラメータのデータ型を識別することができます試してみてください。

 adapter.SelectCommand.Parameters.AddWithValue("@client_code", cod_client); 
     adapter.SelectCommand.Parameters.AddWithValue("@begin_date", LastYear.Date); 
     adapter.SelectCommand.Parameters.AddWithValue("@end_date", Today.Date); 
+1

これは根本的な問題(日付値をテキストとして送る)と最も重要な[AddWithValueはとにかく悪い練習です](http:///blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)。 – Alejandro

関連する問題