2017-01-22 5 views
0

サブクエリを持つOleDbCommandを使用して "条件式のデータ型の不一致"が発生します。実際のデータベースはAccessですが、データベースにクエリを提示するまではわかりません。サブクエリでOleDbCommandを使用した "条件式のデータ型の不一致"

DateTime EventDate; 
string HT,AT; 
int HS,AS; 
OleDbCommand cmd 

cmd.CommandText = @"INSERT INTO TheTable (EventDate,HT,HS,[AS],[AT]) 
    SELECT top 1 @EventDate,@HT,@HS,@AS,@AT FROM TheTable 
WHERE NOT EXISTS (SELECT 1 FROM TheTable WHERE [email protected])"; 

cmd.CommandType = CommandType.Text; 
cmd.Parameters.AddWithValue("@EventDate", EventDate); 
cmd.Parameters.AddWithValue("@HT", HT); 
cmd.Parameters.AddWithValue("@HS", HS); 
cmd.Parameters.AddWithValue("@AS", AS); 
cmd.Parameters.AddWithValue("@AT", AT); 
cmd.Parameters.AddWithValue("@HT2", HT); 

サブクエリを削除すると問題なく動作します。私はすべての変数が正しい型であり、有効な値であると確信しています。サブクエリを取り除くとうまくいきます。

OleDbCommandでパラメータが機能しないサブクエリについては何かありますか?

UPDATE:設定日付の種類を試してみましたが、それが答えはサブクエリが最初に評価されていることであるに違い

cmd.Parameters.Add("@EventDate", OleDbType.Date); 
cmd.Parameters["@EventDate"].Value = EventDate; 
+1

_AddWithValue_の代わりに_cmd.Parameters.Add(name、type).Value = value_を使用します。特にmsアクセスエンジンに日付を渡そうとしたとき – Steve

+0

ありがとう、試してみましたが、違いはありませんでした(更新を参照) –

+1

'cmd.Parameters.AddWithValue(" @ EventDate "を使って' EventDate'のミリ秒部分を省略してみてください。 DateTime(EventDate.Year、EventDate.Month、EventDate.Day、EventDate.Hour、EventDate.Minute、EventDate.Second)); '。私の知るところでは、あなたの問題は、 'OleDbType'が' DateTime'パラメータをどのように扱うかに由来しているようです。 –

答えて

0

をしませんでした。すぐにOleDbCommandを使用した人は、パラメータの名前が順序に関係なく、SQLのパラメータの順序と一致しなければならないことを知っています。しかし、この場合、サブクエリは最初にと評価されるので、と推測されます。その場合、パラメータは最後にになりますが、最初にに入力する必要があります。

cmd.CommandType = CommandType.Text; 
cmd.Parameters.AddWithValue("@HT2", HT); 
cmd.Parameters.AddWithValue("@EventDate", EventDate); 
cmd.Parameters.AddWithValue("@HT", HT); 
cmd.Parameters.AddWithValue("@HS", HS); 
cmd.Parameters.AddWithValue("@AS", AS); 
cmd.Parameters.AddWithValue("@AT", AT); 
関連する問題