2016-08-26 16 views
1

私は、日付の制約をいくつか指定してクエリを実行しています。以下のコードを日付がハードコードされ、パラメータなしで実行すると、期待した結果(単純な整数)が得られます。しかし、私はパラメータを使用しようとすると空の結果セットが得られます。エラーはなく、結果はありません。C#でOdbcConnectionで動作するパラメータを取得できません

log("Connecting to SQL Server..."); 
string connectionString = "DSN=HSBUSTEST32;"; 

string queryString = "SELECT COUNT(*) FROM Table WHERE myDateTime >= '?' AND myDateTime < '?'"; 
//string queryString = "SELECT COUNT(*) FROM Table WHERE myDateTime >= '@startDate' AND myDateTime < '@endDate'"; 

string startDate = "2016-08-23"; 
string endDate = "2016-08-24"; 

using (OdbcConnection connection = new OdbcConnection(connectionString)) 
{ 
    OdbcCommand command = new OdbcCommand(queryString, connection); 
    command.Parameters.AddWithValue("startDate",startDate); 
    command.Parameters.AddWithValue("endDate", endDate); 
    //command.Parameters.Add("startDate", OdbcType.VarChar).Value = "2016-08-23"; 
    //command.Parameters.Add("endDate", OdbcType.VarChar).Value = "2016-08-24"; 

    try 
    { 
     connection.Open(); 
     OdbcDataReader reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      log(reader[0].ToString()); 
     } 
     reader.Close(); 
    } 
    catch (Exception ex) 
    { 
     log(ex.Message); 
    } 
} 

あなたは私が名前付きパラメータと同様に?プレースホルダを使用して両方を試した見ることができるように。私はまた、実際に私は違いを理解していませんが、Add()AddWithValue()のパラメータを追加するいくつかの異なる方法を試してみました。

何が空の結果を引き起こしていますか?

+0

はあなたのクエリから単一引用符を削除しようとしたことがありますか?また、私は、パラメータにaddrデータ型のアドバイスをします。 –

+0

...一重引用符を削除して固定しました。説明してください。それはパラメータに含意されていますか? /フラストレーション –

+0

それはデータ型が文字列なので、それだけですか? –

答えて

2

私が前に言ったようなあなたの質問の問題は一重引用符です。パラメータなしで値を渡すと、これらの一重引用符を使用する必要があります。これは、文で文字列を定義するためです。

パラメータを使用すると、フレームワークによってすべてのものがハンドリングされます。また、SQLインジェクションをチェックし、不要な文字を削除します。特に文字列と日時の値については、これは本当に役に立ちます。

+0

ありがとうございます。私はデータ型に取り組んでいますが、 'OdbcDatatype.Timestamp'を使うと、'現在、DateTimeのパラメータ値をByte []に​​変換できませんでした。私はそれと一緒に遊ぶつもりです。 –

+0

このエラーは、タイムスタンプがバイト[]値を表すためです。たぶんあなたのニーズに合ったタイプは日時です。この[記事](https://msdn.microsoft.com/en-us/library/system.data.odbc.odbctype(v = vs.110).aspx)には、すべてのデータ型の一覧と、表示されたデータが表示されます。 –

+0

'DateTime'では空白の結果が再び表示されます。デバッガで "レンダリングされた" queryStringを見る方法はありますか? 'command.ExecuteReader()'の後でさえ、 '?'プレースホルダを持ちます。 –

-1

これを使用してください:

string queryString = "SELECT COUNT(*) FROM Table WHERE myDateTime >= @startDate AND myDateTime < @endDate"; 

が、これを試してみてください。

command.Parameters.AddWithValue("@startDate",startDate); 
command.Parameters.AddWithValue("@endDate", endDate); 
関連する問題