2013-12-11 2 views
0

У меня проблема, когда я не могу запустить функцию из базы данных с использованием ODP.NET, потому что я не могу преобразовать один из моих аргументов в метку времени.Как конвертировать Datetime в OracleTimeStamp

Я использую: ODAC121010Xcopy_32bit ODP.NET4

Я проверил немало вопросов, и я также попытался преобразования объекта DATETIME в формате строки, чтобы передать его. Я потратил на это много часов и, честно говоря, не могу понять, не хватает ли я чего-то. Похоже, что это такая вещь здравого смысла, и я не могу понять, в чем заключается моя жизнь, почему это не работает, любая помощь будет оценена по достоинству.

Вот мой код:

using (var Command = new OracleCommand("PMH.QueryGetSql", Connection)) 
{ 
    Command.CommandType = CommandType.StoredProcedure; 
    Connection.Open(); 

    OracleTimeStamp ots = new OracleTimeStamp(DateTime.Now); 
    Command.Parameters.Add("return", OracleDbType.Varchar2, ParameterDirection.ReturnValue); 
    Command.Parameters.Add("a", OracleDbType.Int32, ParameterDirection.Input).Value = 1001; 
    Command.Parameters.Add("b", OracleDbType.TimeStamp, ParameterDirection.Input).Value = ots; 


    Command.ExecuteNonQuery(); 
    Console.WriteLine(Command.Parameters["return"].Value); 
    Console.WriteLine("Completed"); 
} 

Вот исключение я получаю:

Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL: числовое или значение ERR или: строка символов, буфер слишком мал ОРА-06512: в строке 1 на Oracle.DataAccess.Client.OracleException.HandleErrorH elper (Int32 ERRCODE, OracleConnection сопп, IntPtr opsErrCtx, OpoSqlValCtx * POPO SqlValCtx, SRC объекта, S Тринг процедуру, Boolean, Int32 bCheck isRecoverable) на Oracle.DataAccess.Client.OracleException.HandleError (Int32 ERRCODE, Oracle соед соединения, процедуру String, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx , ЦСИ Object, Boolean) bCheck в Oracle. DataAccess.Client.OracleCommand.ExecuteNonQuery()

Наконец, здесь есть функция, которую я пытаюсь запустить:

FUNCTION QueryGetSql(nQueryId INTEGER,dSyncFromTimeStamp TIMESTAMP DEFAULT NULL) RETURN VARCHAR2 IS 
--nResult  INTEGER := 0; 
sQuerySql  VARCHAR2(32767); 
sTableName  VARCHAR2(100); 
sPKName   VARCHAR2(100); 
sQueryColumns VARCHAR2(32767); 
sConditions  VARCHAR2(32767); 
sNullColumns VARCHAR2(32767); 

CURSOR qc_cur IS 
SELECT column_name 
    FROM pmh$_app_query_columns 
WHERE query_id = nQueryId 
ORDER BY seq ASC; 

Также отметим, что в то время как у меня есть доступ, чтобы увидеть код оракула, Я этого не писал и поэтому предпочел бы не Измени это.

+1

Уверены ли вы, что вы не перекрываете одну из ваших переменных VARCHAR2, поскольку в случае этого кода ошибки гораздо более вероятна, чем проблема с 'TIMESTAMP'? – tpeczek

+0

Я вернулся в базу данных и прокомментировал весь код после «начала» функции, и я не получил ошибку! Мне очень любопытно, но почему это говорит о том, что ошибка находится в строке 1, потому что ничто не назначено им в строке 1. Большое спасибо за то, что дал мне эту идею! – Aelphaeis

+1

С точки зрения ODP.NET весь вызов хранимой процедуры является строкой один, он не заглядывает внутрь - каждое исключение из процедуры будет выбрано в строке 1. – tpeczek

ответ

1

Вы должны указать максимальный размер возвращаемого значения, т.е.

Command.Parameters.Add("return", OracleDbType.Varchar2, 1000, null, ParameterDirection.ReturnValue); 

«нуль» начальное значение, в VB.NET у вас есть не использовать «Nothing» вместо этого.

+0

Это был очень хороший улов. Полностью отличается от первоначального вопроса, который я задал. Я исправил это, и он прошел как шарм. – Aelphaeis

Смежные вопросы