2012-03-19 25 views
0

今日の日付を挿入しようとしていますが、再帰的に日付を増やしてみています。変換エラーメッセージが表示されます。データベースにGetDate()を挿入しようとするとエラーが発生します

private void InsertTimesheetWeek(string timeSheetID) 
{ 
    int row = GViewTimeSheet.Rows.Count;//get the row count 
    int counter = 0; 

    string[] txtDate = new string[row];// date column 

    foreach (GridViewRow gRow in GViewTimeSheet.Rows) 
    { 

     txtDate[counter] = "GetDATE()+"+counter; 

     counter++; 
    } 

    //Intializing sql statement 
    string fields = "(TimeSheetID, Date)"; 
    string parm = "(@TimeSheetID, @Date)"; 
    string sqlStatement = "insert into TimeSheetWeeks" + fields + "Values" + parm; 

    SqlCommand comm = new SqlCommand(); 
    comm.CommandText = sqlStatement;//assing sql statement as command 
    SqlConnection connection = DataAccess.getConnection(); 
    comm.Connection = connection; 

    try 
    { 
     connection.Open(); 
     for (int i = 0; i < row; i++) 
     { 
      comm.Parameters.AddWithValue("@TimeSheetID", timeSheetID); 
      comm.Parameters.AddWithValue("@Date", txtDate[i]); 

      comm.ExecuteNonQuery(); 
      comm.Parameters.Clear(); 
     } 

    } 
    catch (Exception ex) 
    { 
     Utilities.LogError(ex); 
     throw ex; 
    } 
    finally 
    { 
     if (connection.State == ConnectionState.Open)// if the connection opened then 
     { 
      connection.Close();//just close the connection in any way 
     } 
    } 
} 

なぜエラーが発生しますか?

+0

を得ています?また、ブレークポイントで実行して、** "@ Date"、txtDate [i] **、おそらく** txtDate [i] **内の値をチェックしてください。エラーが発生します –

+0

エラーメッセージ:文字列から日付や時刻を変換しています。 "私はデバッグを試して、すべてのものが良い(値 "GetDATE()+ 0"、 "GetDATE()+ 1"、 "GetDATE()+ 2" ....) – Sas

答えて

2

"GetDATE()+ 1"、 "GetDATE()+ 2"などをパラメータとして渡すとエラーが発生し、SQLはこれを日付に変換できません。

は、SQLに送信する前に、コードの日付の計算を実行します。

txtDate[counter] = DateTime.Now.AddDays(counter); 

あなたは、各行のリテラルとしてSQLステートメントを構築した場合は、撮影したアプローチが働くだろう。
例:*

for (int i = 0; i < row; i++) 
{ 
    string fields = "(TimeSheetID, Date)"; 
    string parm = String.Format"({0}, GetDATE() + {1})", timeSheetID, i); 
    string sqlStatement = "insert into TimeSheetWeeks" + fields + "Values" + parm; 

    // .... 

* N.B.上記のコードは使用しないでください - 私はこれを一例として提供しました。可能であれば、常にSQLパラメーターを使用してください。パラメータは型保証されており、SQLインジェクションのリスクを軽減します。 How To: Protect From SQL Injection in ASP.NET

+0

DateTime.Now.AddDays(Counter) 。 Thanx – Sas

+0

うれしかった!常に喜んで助けてください。 :-D – David

2

私は二つのことだろう。

1)ループの外にパラメータの作成を移動する - あなただけの

2一度、それらを作成する必要があります)AddWithValueメソッドを使用していません、

// Intializing sql statement 
string fields = "(TimeSheetID, Date)"; 
string parm = "(@TimeSheetID, @Date)"; 
string sqlStatement = "insert into TimeSheetWeeks" + fields + "Values" + parm; 

using(SqlConnection connection = DataAccess.getConnection()) 
using(SqlCommand comm = new SqlCommand(sqlStatement, connection)) 
{ 
    comm.Parameters.Add("@TimeSheetID", SqlDbType.VarChar, 50); // just guessing 
    comm.Parameters.Add("@Date", SqlDbType.DateTime); 

    try 
    { 
     connection.Open(); 

     for (int i = 0; i < row; i++) 
     { 
      comm.Parameters["@TimeSheetID"] = timeSheetID; 
      comm.Parameters["@Date"] = txtDate[i]; 

      comm.ExecuteNonQuery(); 
     } 

     connection.Close(); 
    } 
    catch (Exception ex) 
    { 
     Utilities.LogError(ex); 
     throw; 
    } 
} 
: - その方法は、 推測にデータ型を持っているので、それが倍

で、それは間違っているかもしれませんので、これを使用します他の人のよう

はすでにも少し奇妙である

txtDate[counter] = "GetDATE()+"+counter; 

のためのあなたの構文、指摘している - あなたがここでやろうとしていますか?何を追加しようとしていますか?counter日?月?年?秒 `はっきりしないまったく....

たぶん、あなたは、日付の値を設定している点にそのロジックを「移動」することができます?

for (int i = 0; i < row; i++) 
{ 
    comm.Parameters["@TimeSheetID"] = timeSheetID; 
    comm.Parameters["@Date"] = DateTime.Today.AddDays(i); // is that what you need? 

    comm.ExecuteNonQuery(); 
} 
+0

私は、SQLの "date +#"の動作であるため、日数を加算することを意図しています。 – David

+1

はい日数を増やそうとしています。 Ur最後の方法は私がprobを解決するのを助けた。 Thanx – Sas

2

は、これを変更してみてください:

txtDate[counter] = "GetDATE()+"+counter; 
これに

:エラーメッセージは何を

txtDate[counter] = DateTime.Now.AddDays(counter); 
+0

それはうまくいった。 Thanx – Sas

関連する問題