У меня проблема, когда я не могу запустить функцию из базы данных с использованием 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;
Также отметим, что в то время как у меня есть доступ, чтобы увидеть код оракула, Я этого не писал и поэтому предпочел бы не Измени это.
Уверены ли вы, что вы не перекрываете одну из ваших переменных VARCHAR2, поскольку в случае этого кода ошибки гораздо более вероятна, чем проблема с 'TIMESTAMP'? – tpeczek
Я вернулся в базу данных и прокомментировал весь код после «начала» функции, и я не получил ошибку! Мне очень любопытно, но почему это говорит о том, что ошибка находится в строке 1, потому что ничто не назначено им в строке 1. Большое спасибо за то, что дал мне эту идею! – Aelphaeis
С точки зрения ODP.NET весь вызов хранимой процедуры является строкой один, он не заглядывает внутрь - каждое исключение из процедуры будет выбрано в строке 1. – tpeczek