В типе отметки времени Oracle отсутствует информация о времени - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь сохранить значение datetime в oracle из .net, и когда время даты сохраняется в БД, информация о времени отсутствует.

БД - 11g, и я использую классы OracleCommand и OracleConnection из сборки Oracle.DataAccess версии 2.111.6.20.

У меня есть слой данных в .net, который вызывает хранимую процедуру оракула. Параметр для рассматриваемого поля даты является параметром IN, который помечается как тип данных TimeStamp. Поле в таблице также определяется как метка времени.

// Add the parameter to the OracleCommand
var dt = new DateTime(2011,07,07,10,0,0);
cmd.Parameters.Add("RECEIVED", OracleDbType.TimeStamp, 6, dt, System.Data.ParameterDirection.Input);
cmd.ExecuteNonQuery();

Значение параметра содержит информацию о времени (10:00), но когда оно сохраняется в БД, информация о времени отсутствует.

Моя хранимая процедура выглядит примерно так ...

create or replace
PROCEDURE DATA_INSERT 
(
  ID OUT NUMBER
, RECEIVED IN TIMESTAMP
) AS 
BEGIN

  ID := MY_SEQUENCE.nextval;
  INSERT INTO DATA (ID, RECEIVED) VALUES (ID, RECEIVED);

END DATA_INSERT;

Есть идеи, почему метка времени теряет информацию о времени?

Ответы [ 4 ]

2 голосов
/ 30 марта 2011

Хорошо, думаю, я понял, в чем проблема. В приведенном выше примере я исключил некоторые дополнительные параметры из моего хранимого процесса для berevity. У меня есть другие параметры в запросе, некоторые из которых имеют тип данных DATE. Итак, рассмотрим следующую таблицу ...

  CREATE TABLE TEST (DATE_FIELD DATE, TIMESTAMP_FIELD TIMESTAMP);

И хранимая процедура ...

CREATE OR REPLACE PROCEDURE TEST_INSERT ( P_DATE IN DATE, P_TIMESTAMP IN TIMESTAMP ) AS 
BEGIN
  INSERT INTO TEST(DATE_FIELD, TIMESTAMP_FIELD) VALUES(P_DATE, P_TIMESTAMP);
END TEST_INSERT;

И следующее c # ...

using (var cmd = new OracleCommand("TEST_INSERT", conn))
{
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.Parameters.Add("P_TIMESTAMP", OracleDbType.TimeStamp
        , new DateTime(2011, 07, 07, 10, 0, 0), System.Data.ParameterDirection.Input);
    cmd.Parameters.Add("P_DATE", OracleDbType.Date
        , new DateTime(2011, 07, 08), System.Data.ParameterDirection.Input);

    cmd.ExecuteNonQuery();
}

Результат будет ...

DATE_FIELD: 11-07-07 
TIMESTAMP_FIELD: 11-07-08 00:00:00.000000000

Таким образом, даже если параметры названы, кажется, что имя параметра не имеет значения, и порядок, в котором параметры добавляются в коллекцию параметров в .net, определит значения параметров в хранимой процедуре. .

Итак, во фрагменте c # вы меняете порядок добавления параметров в коллекцию на ...

cmd.Parameters.Add("P_DATE", OracleDbType.Date
     , new DateTime(2011, 07, 08), System.Data.ParameterDirection.Input);
cmd.Parameters.Add("P_TIMESTAMP", OracleDbType.TimeStamp
     , new DateTime(2011, 07, 07, 10, 0, 0), System.Data.ParameterDirection.Input);

тогда результат будет ...

DATE_FIELD: 11-07-08 
TIMESTAMP_FIELD: 11-07-07 10:00:000000000
0 голосов
/ 05 июня 2019

Если вы используете dll, предоставляемую Oracle, по умолчанию он связывает переменные.Добавьте следующую строку кода перед выполнением привязки к именам.

cmd.BindByName = true;
0 голосов
/ 29 марта 2011

Я запустил ваш код в таблицу, и мои результаты были (07-JUL-11 10.00.00.000000000 AM), что и ожидается.Я вижу, что вы используете одно и то же имя для столбца и параметра, попробуйте предварительно дождаться "p_" перед именем переменной и посмотрите, работает ли оно

, это то, что я запустил: В Oracle:

 create table t_data(received timestamp);

в c #

  Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand("BEGIN INSERT INTO t_DATA (RECEIVED) VALUES (:RECEIVED); END;",con);
        // Add the parameter to the OracleCommand
        DateTime dt = new DateTime(2011,07,07,10,0,0);
        cmd.Parameters.Add("RECEIVED", OracleDbType.TimeStamp, 6, dt, System.Data.ParameterDirection.Input);
        cmd.ExecuteNonQuery();

обратно в Oracle

   select * from t_data            

RECEIVED                  
------------------------- 
07-JUL-11 10.00.00.000000000 AM 

Если что-нибудь, попробуйте что-то вроде этого, чтобы увидеть, работает ли это, затем вернитесь и проверьте свою процедуру ипосмотрим, не выглядит ли что-то не так (как своенравный ствол)

0 голосов
/ 29 марта 2011

При выдаче этого выбора, что вы видите:

SELECT TO_CHAR(RECEIVED, 'MM/DD/YYYY HH24:MI:SS') FROM data WHERE ID = <value>;
...