2011-07-26 20 views
1

この質問は以前に聞かれましたが、これまでの質問のあとでこのコードが間違っているかどうかはまだ分かりません。エラー:文字列からdatetimeを変換するときに変換に失敗しました.NET SQL Server

私は英国にいます。

public static void GetDataForCSEP(string viewName, string schemaName, 
              string dateFieldName, DateTime startDate, DateTime endDate) 
     { 

      string dateFormat = "yyyy/MM/dd HH:mm:ss"; 


      //Connect to SQl Server 

      string commandText = "SELECT * FROM " + schemaName + "." + viewName + " WHERE @dateFieldName BETWEEN @startDate AND @endDate"; 


      using (SqlCommand sqlCmd = new SqlCommand(commandText,sql_Conn)) 
      { 
       sqlCmd.CommandType = CommandType.Text; 

       sqlCmd.Parameters.Add("@dateFieldName",SqlDbType.NVarChar, 30).Value = dateFieldName; 
       sqlCmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = DateTime.Parse(startDate.ToString(dateFormat)); 
       sqlCmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = DateTime.Parse(startDate.ToString(dateFormat)); 



       sql_Conn.Open(); 
       sqlCmd.ExecuteNonQuery(); 


      } 
} 
+1

なぜあなたは 'DateTime.Parse(startDate.ToString(dateFormat))'を実行していますか? - 'startDate'は既にDateTime値です。それを文字列に変換して元に戻すのはなぜですか? –

+0

私はごみプログラマなので – MrBliz

答えて

2

は、パラメータとして

"SELECT * FROM " + schemaName + "." + viewName + " 
WHERE @dateFieldName BETWEEN @startDate AND @endDate"; 

を列名を渡すことはできません、これはSQLインジェクション攻撃を避けるために

"SELECT * FROM " + schemaName + "." + viewName + " 
WHERE " + dateFieldName + " BETWEEN @startDate AND @endDate"; 

あるべきである、これは動的であるため、この種のクエリを実行するためにSp_executeSQLの使用を作りますSQLクエリ。

+0

ありがとう、これはトリックを – MrBliz

+0

合意しました。構造化されたコードは、静的文字列 '@ dateFieldName'が2つの日付の間にあるかどうかをチェックしようとします。これを行うために、SQLエンジンは '@ dateFieldName'のテキスト値を日付に変換しようとしていますが失敗しています。 – MatBailie

1

それはあなたのSQL Serverのロケール設定によって異なりますが、おそらく

string dateFormat = "dd-MMM-yyyy HH:mm:ss"; 

はあなたのために働くのだろうか?エラー時に

+0

THanks、どうすればこれらの設定を見つけることができますか?ログイン固有のものではないのですか? – MrBliz

+0

はい、いいえ - 既定値がありますが、ユーザーの接続期間などの間は変更することもできます。DBA側にはあまり慣れていないので、Books Onlineをチェックします。 – Widor

関連する問題