Oracle日期格式 - 数据读取器无法识别to_char函数

时间:2011-12-05 23:07:18

标签: c# oracle

基本上只是在YYYYMMDD中抽出一个日期,我可以在查询分析器中做到这一点但是当我尝试在C#中运行此查询时,我一直得到一个未找到列的错误,它似乎也很难进行连接(但这不是一个问题)所以有点不确定这里发生了什么..我真的只是想让我的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.";
    }

3 个答案:

答案 0 :(得分:3)

首先,您可以从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. 查询中有 no from clause 和table_name。

  2. 可能不是问题的原因,但想指出来。 由于你正在做一个to_char,我假设ProblemDate是一个日期数据类型。始终建议在比较时使用显式强制转换,因此将条件更改为

    ProblemDate&gt; = to_date('03 -oct-2011','dd-mon-yyyy')和 ProblemDate&lt; = to_date('08 -oct-2011','dd-mon-yyyy')

答案 1 :(得分: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' ) )";

答案 2 :(得分:1)

你的问题可能与这一行有关:

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

尝试将函数标记为某个东西,因为您没有调用“ProblemDate”来调用函数。如果输出回来的数组,你可能会看到它的名称。

编辑:您也可以查看此行

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

因为在DB的调用中存在data2,而不是data3