Хорошо, думаю, я понял, в чем проблема. В приведенном выше примере я исключил некоторые дополнительные параметры из моего хранимого процесса для 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