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 框架 3.5 和 Oracle 10g。

4

2 回答 2

1

可能从DateTimeto的转换string是 Sql 服务器无法识别的格式。
您应该使用SqlParameter而不是将字符串与值连接起来。还要确保值的类型正确。(DateTimedatevalue和不string

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 回答