2011-12-05 58 views
2

基本上只是拉日期出YYYYMMDD,我可以在查詢分析器這樣做很好,但是當我嘗試運行在C#此查詢我不斷收到一列未找到錯誤它似乎也很難做拼接(但這不是一個問題),所以有點不確定這裏發生了什麼......我真的只想讓我的to_char函數工作。想法?謝謝!Oracle日期格式 - 數據讀取器不能識別TO_CHAR函數

string oradb = "user id=x;password=x;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)" 
     +"(HOST=x)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=x)));"; 

    OracleConnection conn = new OracleConnection(oradb); 
    conn.Open(); 

    OracleCommand cmd = new OracleCommand(); 
    cmd.Connection = conn; 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = 
     "SELECT to_char(ProblemDate, 'yyyymmdd'), data1, data2," 
     +"data4, data5, data6" 
     +" WHERE (ProblemDate >='03-oct-2011') " 
     +"AND (ProblemDate <= '08-oct-2011') AND " 
     +"(data1 in ('3','5','6'))"; 
    OracleDataReader dr = cmd.ExecuteReader(); 

    string fileOut1 = Request.PhysicalApplicationPath; 
    string fileOut = fileOut1 + "Text5.txt"; 
    // Creates the file 
    StreamWriter sw = new StreamWriter(fileOut); 
    if (dr.HasRows) 
    { 
     while (dr.Read()) 
     { 
      string data1= (string)dr["data1"].ToString(); 
      string data2 = (string)dr["data3"].ToString(); 
      string data3 = (string)dr["data4"]; 
      string data4 = (string)dr["data5"].ToString(); 
      string data5 = (string)dr["data6"].ToString(); 
      string ProblemDate = (string)dr["ProblemDate"].ToString(); 

      //remove the comma 
      char[] MyChar = { ',' }; 

      sw.WriteLine(data1.PadRight(10) + data2.PadRight(5) + data3.TrimEnd(MyChar) + "000" + 
       data4 + "000" + data5+ ProblemDate + " " + "N"); 

      Label1.Text = "File created successfully.<br />"; 
      Label1.Text += fileOut1; 
     } 
     // Closes the connenction. 
     sw.Close(); 
     conn.Close(); 
    } 
    else 
    { 
     Label1.Text = "No data written."; 
    } 

回答

2

您是否嘗試別名列?例如。

SELECT to_char(ProblemDate, 'yyyymmdd') as ProblemDate, data1, data2 ... 

作爲便箋,您可能會遇到WHERE條款中的日期比較問題。誠然,我不知道你的應用程序,客戶端和/或服務器區域設置,也許你的例子只是爲了說明什麼,但我想這將是更安全的使用TO_DATE比字符串比較:

cmd.CommandText = 
    "SELECT to_char(ProblemDate, 'yyyymmdd') as ProblemDate, data1, data2," 
    +"data4, data5, data6" 
    +" WHERE (ProblemDate >= TO_DATE('03-oct-2011', 'DD-MON-YYYY')) " 
    +"AND (ProblemDate <= TO_DATE('08-oct-2011', 'DD-MON-YYYY')) AND " 
    +"(data1 in ('3','5','6'))"; 
+0

哦,哇。這是我沒有嘗試的唯一的事情。謝謝! – mtnwk

+1

我一開始並沒有注意到這一點,但正如@Rajesh在他的回答中指出的那樣,沒有'FROM'子句,這也是一個問題。 :) – wweicker

+0

@mtnwk這個答案(或另一個)解決了你的問題嗎?如果是這樣,請將相應的答案標記爲已接受。 – wweicker

1

你的問題很可能與這一行:

string draw_date = (string)dr["ProblemDate"].ToString(); 

嘗試貼標功能的東西,因爲你不是叫「ProblemDate」你調用一個函數。如果你輸出返回的數組,你可能會看到它的名字。

編輯:你也可能要檢查這一行

string data2 = (string)dr["data3"].ToString(); 

是有數據2,而不是在調用數據庫

3

一個DATA3首先,你能打印查詢從Java內部看到實際的查詢被解僱?

這是我看到的問題......

SELECT to_char(ProblemDate, 'yyyymmdd'), data1, data2, 
     data4, data5, data6 
     WHERE (ProblemDate >='03-oct-2011') 
     AND (ProblemDate <= '08-oct-2011') 
     AND data1 in ('3','5','6')); 
  1. 沒有FROM子句和table_name的查詢。

  2. Priobably不是問題的原因,但要指出來。 由於你正在做一個to_char,我假設ProblemDate是一個日期數據類型。它總是建議使用比較時顯式轉換,所以改變條件以

    ProblemDate> = TO_DATE('03 - 辛2011' , 'DD-MON-YYYY')和 ProblemDate < = TO_DATE(」 08-oct-2011',,'dd-mon-yyyy')