3

ストアドプロシージャを使用してページリストを取得します。これが私の方法です。

using(SqlConnection conn = new SqlConnection(_connectionString)) {
   using(SqlCommand cmd = new SqlCommand("[GetPagedSP]", conn)) {
      cmd.CommandType = System.Data.CommandType.StoredProcedure;

       //Passing Parameters 
       **Update**
       SqlParameter spCreationDate = new SqlParameter("@CreationDate_9", CreationDate);
       spCreationDate.IsNullable = true;
       cmd.Parameters.Add(spCreationDate);

       // ........
       //Finished Passing Parameters
       conn.Open();

       SqlDataReader dr = cmd.ExecuteReader();

       while(dr.Read()) {
          //Get Values
       }
       conn.Close();
   }
}

そして、これは私のストアドプロシージャコマンドです。

CREATE TABLE #PagingTemp  (
[RowId]           [bigint]    IDENTITY(1,1)    NOT NULL,
[RecordId]        [bigint]  
);

INSERT INTO [#PagingTemp] ([RecordId])
SELECT  [CAR].[Id]      
FROM [Article] AS [CAR] ;

SELECT [CAR].*
FROM [Collections].[Article] AS [CAR]
INNER JOIN [#PagingTemp] AS [PT] ON [CAR].[Id] = [PT].[RecordId]
WHERE [PT].[RowId] BETWEEN 1 AND 50;

SQLでクエリを実行すると、すべて問題ありませんが、.NETでは次の行に例外があります。

SqlDataReader dr = cmd.ExecuteReader();

例外は次のとおりです。

System.Data.SqlTypes.SqlTypeExceptionは、ユーザーコード
Message=SqlDateTimeオーバーフローによって処理されませんでした。1/1/175312:00:00AMから12/31/999911:59:59PMの間にある必要があります。
Source = System.Data

アップデート

SQLでクエリを実行する例: ここに画像の説明を入力してください

それはとても奇妙で、何が起こったのか分かりませんか?

datetime大きい12/31/9999または小さい値はありません1/1/1753

データベースにnull値を持つNullable日時値がいくつかあります。

どう思いますか?問題はどこだ?

4

3 に答える 3

0

ストアドプロシージャを実行するために渡す前に、変数CreationDateに有効な日付を割り当てます

  //Passing Parameters 

   CreationDate = DateTime.Now or any other date you want if you dont want to pass any date then assign DBNull.Value

   **Update**
   SqlParameter spCreationDate = new SqlParameter("@CreationDate_9", CreationDate);
   spCreationDate.IsNullable = true;
   cmd.Parameters.Add(spCreationDate);

これで問題が解決することを願っています。

于 2012-07-30T08:26:30.020 に答える
0

可能であれば、ここにSPを貼り付けてください。修正を提案することをお勧めします。今のところ、次の可能性を検討して修正を試みることができます。

selectが問題を引き起こしている場合は、次のようにNULL日付を最小日付に置き換えることを検討してください。

SELECT IsNULL(CreationDate,'1/1/1753') CreationDate, IsNULL(LastBidDate,'1/1/1753') LastBidDate from yourtable.

参考までに、別の回答済みの質問があります: error-sqldatetime-overflow-must-be between-1-1-1753-120000-am-and-12-31-999

于 2012-07-30T09:03:55.637 に答える
0

タイプパラメータを渡したときにselectコマンドのコメントで述べたように、 Gavinパラメータ値が正しい範囲にあるかどうかを確認する必要があります()?パラメータを渡し、その値がnullだと思いました。また、この場合、クエリでこのパラメータを使用することはありません。したがって、null値は正しく、コマンドでのパラメータの使用は重要ではありません。もう一度確認すると、パラメータの値がnullではなく、であること。別の解決策は、 .Netがサポートするすべての範囲をサポートするタイプを使用することです。Nikola MarkovinovićDateTime1/1/1753 to 12/31/9999Nullable DateTime1/1/0001DATATIME2SQLDateTime

于 2012-07-31T11:28:29.363 に答える