2012-09-27 43 views
0

我有一個數據庫,其中包含一個表,其中存儲了幾個值以及它所屬的區域,日期和時間來自。該表將定期更新,從一個可能包含我已有的新舊數據的源中,將插入新數據,我已經存儲的舊數據將被更新,因爲它可能已經從它創建的時間和I需要最新的可能。通過檢查區域,日期和時間檢查表中是否已經存在條目

我閹區沒有問題的檢查和時針已經存在:

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

的比較,必須像這樣在Oracle:

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

試試這個,如果你想保持字符串版本,但使用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

1

也許從DateTimestring的轉換格式是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注入攻擊。