Формат даты Oracle - считыватель данных не распознает функцию to_char - PullRequest
2 голосов
/ 06 декабря 2011

По сути, просто извлекая дату в ГГГГММДД, и я могу сделать это нормально в анализаторе запросов, но когда я пытаюсь выполнить этот запрос в 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 ]

3 голосов
/ 06 декабря 2011

Для начала, вы можете напечатать запрос изнутри 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 и table_name.

  2. Вероятно, не причина проблемы, но хотел указать на это. Так как вы делаете to_char, я предполагаю, что ProblemDate является типом данных date. Всегда рекомендуется использовать явное приведение при сравнении, поэтому измените условия на

    ProblemDate> = to_date ('03-oct-2011 ',' dd-mon-yyyy ') и ProblemDate <= to_date ('08 -oct-2011 ',,' dd-mon-yyyy ') </strong>

2 голосов
/ 06 декабря 2011

Вы пробовали использовать псевдоним столбца?например.

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' ) )";
1 голос
/ 06 декабря 2011

Ваша проблема, вероятно, связана с этой строкой:

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

Попробуйте пометить функцию как нечто, потому что вы не вызываете «ProblemDate», вы вызываете функцию. Если вы выведете возвращаемый массив, вы, вероятно, увидите, как он называется.

РЕДАКТИРОВАТЬ: также вы можете проверить эту строку

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

так как есть данные2, но не данные3 в обращении к БД

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...