0

私は、それが属するゾーン、それが由来する日付、およびそれが由来する時間とともにいくつかの値を格納するテーブルを備えたデータベースを持っています。テーブルは定期的に更新されます。ソースから、すでに持っている新しいデータと古いデータの両方が含まれている可能性があります。新しいデータが挿入され、すでに保存されている古いデータが更新されます。これは、作成された時点から変更されている可能性があるためです。可能な限り最新のものが必要です。

ゾーンと時間がすでに存在するかどうかを確認するのに問題はありません。

sql.CommandText = "select 'Y' from dual where exists (select * from mytable where hour= "+hour+" and zone='" + zone+ "')"

ただし、方程式に日付を追加すると、ExecuteScalarメソッドを呼び出すときに失敗します。

sql.CommandText = "select 'Y' from dual where exists (select * from mytable where hour = " + hour + " and zone = '" + zone+ "' and date_field = '" + datevalue + "')"

私は以前に他の方法を試しましたが、Select Count(*)を実行してリーダーを実行したり、文をマージしたりするなど、どれも機能していないようです。

どんな助けでも大歓迎です。私はVB、.NET Framework 3.5、およびOracle10gに取り組んでいます。

4

2 に答える 2

1

おそらく、 からDateTimeへの変換stringは、Sql サーバーが認識しない形式になっています。文字列と値を連結する代わりに、SqlParameter
を使用する必要があります。また、値が正しいタイプであることを確認してください。( forと not )DateTimedatevaluestring

using (var command = new SqlCommand("select 'Y' from dual where exists (select * from mytable where hour = @hour and zone = @zone and date_field = @datevalue)", connection))
{
  command.Parameters.Add(new SqlParameter("hour", hour));
  command.Parameters.Add(new SqlParameter("zone", zone));
  command.Parameters.Add(new SqlParameter("datevalue", datevalue));

  var reader = command.ExecuteReader();
}

これにより、厄介な SQL インジェクション攻撃も回避されます。

于 2012-09-27T20:21:05.350 に答える
0

比較は、Oracle では次のようになります。

... AND date_field = TO_DATE('27-09-2012', 'DD-MM-YYYY')

文字列バージョンを保持したいが、Magnus が示したようにパラメータ化されたクエリを使用する場合は、これを試して、日付表現の問題を回避します。

sql.CommandText = String.Format(@"SELECT 'Y' FROM dual WHERE EXISTS
    (SELECT * FROM mytable
     WHERE hour = {0} AND zone = {1} AND
           date_field = TO_DATE('{2:dd-MM-yyyy}','DD-MM-YYYY'))",
    hour, zone, datevalue);

注:datevalueは であると想定されますDateTime

于 2012-09-27T20:22:22.370 に答える