2011-12-05 12 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

あなたの問題は、おそらく、このラインに関連している:あなたは関数を呼び出している「ProblemDate」を呼び出していませんので、

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

は、何かとしての機能を標識してください。戻って来る配列を出力すると、おそらくそれが呼び出されたものを見ることができます。

EDIT:まずDB

3

への呼び出しでDATA3がDATA2ですが、ないともあなたは、この行

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

を点検したいと思うかもしれないクエリを印刷することができます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. ある無句とクエリ内のTABLE_NAMEからがあります。

  2. 問題の原因ではありませんが、それを指摘したいと思います。 あなたはto_charを実行しているので、私はProblemDateが日付データ型であると仮定しています。それは(と ProblemDate < = TO_DATE常に比較するときに明示的なキャストを使用することをお勧めしますので、

    ProblemDate> = TO_DATEに条件を変更する('03 - オクト2011' 、 'YYYY-MM-DD)を」です08-oct-2011 '、' dd-mon-yyyy ')