我有一个数据库,其中包含一个表,其中我存储了几个值以及它所属的区域,它来自的日期以及它来自的小时。该表将定期更新,从可能包含我已有的新旧数据的源,将插入新数据,我已经存储的旧数据将被更新,因为它可能已经从创建时更改了需要最新的。
我没有问题检查区域和小时已经存在:
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和Oracle 10g。
答案 0 :(得分:1)
从DateTime
到string
的转换可能是Sql server无法识别的格式。
您应该使用SqlParameter而不是将字符串与值连接。还要确保值的类型正确。 (DateTime
而不是datevalue
)
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注入攻击。
答案 1 :(得分:0)
比较必须在oracle中看起来像这样:
... AND date_field = TO_DATE('27-09-2012', 'DD-MM-YYYY')
试试这个,如果你想保留字符串版本,但是使用像Magnus所示的prametrized查询,可以避免日期表示问题:
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
。