1

C#からへのSQLクエリに問題がありますが、Sql Server何が原因かわかりません...。

コードは次のようになります。

SqlCommand cmd = new SqlCommand(
    "SELECT tscoc_Name, 
            tscoc_Start, 
            tscoc_End 
            FROM 
            tbl_SchedulerOnCall 
            WHERE (
                tscoc_Start > @fd 
                AND 
                tscoc_End < @ld) 
                AND 
                tscoc_Start = @state", 
    con);
cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = 
    startDate.ToString("yyyy-MM-dd");
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = 
    startDate.AddDays(14).ToString("yyyy-MM-dd");

SQLクエリは次のとおりです。

exec sp_executesql 
N'SELECT tscoc_Name, 
         tscoc_Start, 
         tscoc_End 
FROM 
tbl_SchedulerOnCall 
WHERE (
    tscoc_Start > @fd 
    AND 
    tscoc_End < @ld) 
    AND 
    tscoc_Start = @state', 
N'@fd datetime, @ld datetime, @state nvarchar(2)', 
@fd = 'Oct  8 2012 12:00:00:000AM', 
@ld = 'Oct 22 2012 12:00:00:000AM', 
@state = N'SA'

そして、エラーは次のとおりです。

日時を文字列から変換する際の構文エラー。

誰もが何が起こっているのか分かりますか?

4

4 に答える 4

4

に代入するときに、値を文字列に変換しています(実際に.NETコードの型であるDateTimeと仮定します) -何のために?それはまったく役に立たず、無意味です...そして、日付/時刻、言語、および地域の設定に潜在的な問題を引き起こします-ご覧のとおり...startDate DateTimeSqlParameter

使用するだけです:

cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = startDate;
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = startDate.AddDays(14);

そして、あなたは元気になるはずです。

于 2012-10-10T07:07:47.017 に答える
1

パラメータ値として追加するために、日時を文字列に変換する必要はありません。生の DateTime オブジェクト自体を追加するだけで、あとは .NET SQL コードが処理します。

于 2012-10-10T07:06:42.063 に答える
0

使用してDateTime.ParseExactください。これは、文字列の日付に非標準形式がある場合に便利です。

  string dateString = "Oct  8 2012 12:00:00:000AM";
  string format = "MMM dd yyyy hh:mm:ssFFFtt";
  CultureInfo provider = CultureInfo.InvariantCulture;
  DateTime result = DateTime.ParseExact(dateString, format, provider);

  cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = result;
于 2012-10-10T07:09:54.803 に答える
0

なぜあなたは使用していAddWithValueますか?その 2 番目のパラメーターは、データ型ではなく、渡す値を意味します。

ただ行う:

SqlCommand cmd = new SqlCommand("SELECT tscoc_Name, tscoc_Start, tscoc_End FROM tbl_SchedulerOnCall WHERE (tscoc_Start > @fd AND tscoc_End < @ld) AND tscoc_Start = @state", con);
cmd.Parameters.AddWithValue("fd", startDate);
cmd.Parameters.AddWithValue("ld", startDate.AddDays(14));

日付を文字列に変換することは、通常、(ここのように) バグを作成するための最初のステップです。

于 2012-10-10T07:20:26.093 に答える