2012-02-29 46 views
5

Tengo aquí el proyecto empresarial con .net 4.0 C#, IBatisNet y CSLA framework.Persiguiendo "ORA-01084: argumento no válido en la llamada OCI"

Uno de los trabajos del proyecto está fallando con ORA-01084: invalid argument in OCI call al llamar insertar proc en un paquete. El mensaje de error devuelto es críptico en el mejor de los casos, el proceso almacenado tiene 83 parámetros de entrada que no están vinculados por nombre (gracias a IBatis).

Lo curioso: tengo un conjunto de registros digamos Order y OrderItems. Order tiene 28 pedidos. El trabajo debe renovar el pedido creando otro Order y copiando todos los registros OrderItems. Los nuevos artículos de pedido hacen referencia a los artículos de pedido anterior por el campo ParentOrderItemId, que también es un criterio de selección para Orders que debe renovarse.

Cuando lo ejecuto la primera vez, el proceso sopla en OrderItemId: 12345 con ORA-01084 error. Pero cuando vuelva a ejecutarlo la próxima vez, procesa con éxito OrderItemId: 12345. Y luego explota en OrderItemId: 12444. Luego vuelvo a ejecutar y procesa correctamente el código OrderItemId: 12444, y así sucesivamente.

Tengo registros de DbParameters pasados, son los mismos en ambos casos.

Tengo oci client trace, pero tampoco es útil.

He configurado el inicio de sesión en una capa de base de datos, y hasta ahora no me ha dado nada.

Alguna idea de cómo rastrear ese tipo de errores?

+1

idea vaga: si los parámetros pasados ​​a la llamada OCI son los mismos en la primera ejecución fallida y segunda exitosa (como dijiste se puede ver en el registro de DbParameters), podría haber algún tipo de error de inicialización, posiblemente nulo valores. –

+0

Cuando dices "iniciar sesión en la capa de la base de datos", ¿significa eso que el procedimiento almacenado registra los parámetros de entrada, para que puedas verificar que no haya ningún desajuste entre los valores de las columnas? –

+0

Sí, he agregado un registro minucioso en todas partes para que pueda ver lo que se transfiere en detalle. – b0rg

Respuesta

1

Supongo que después de todos estos años tengo que dar una respuesta.

El problema radica en los controladores Oracle .Net. Tuvimos el campo Qty definido como INT. Debido a la arquitectura interna, la cantidad puede ser negativa o nula. 95% de los casos La cantidad fue un número entero positivo (como debería ser), pero a veces debido a ajustes y otros factores podría ser nulo o negativo.

Así que al final me ha trazado, a la orden de la forma de poner sus registros en la base de datos:

Cantidad 1 Cantidad 0 Cantidad nula Cantidad -1

funciona correctamente.

Pero en este caso:

Cantidad nula Cantidad Cantidad 1 -1

soplará con argumento no válido OCI en el valor "-1".

Creé un boleto en Oracle y lo envié a nuestro equipo de producto para solucionarlo. Desde entonces, seguí adelante, por lo que no estaba muy seguro de cuándo y cuándo se solucionó.

+1

Acabo de probar 12c ODP.Net y el error parece estar aún allí. Parece que no lo han solucionado, ya que podemos duplicarlo consistentemente en nuestra aplicación. – dcp

+1

Mi proyecto era bastante pequeño en ese momento, así que no lo busqué con Oracle. Si ustedes tienen el tiempo y el plan de apoyo de Oracle, pueden intentar impulsarlo. O eso, o un kludge con CANTIDAD no anulable. – b0rg

+1

No tenemos el tiempo :). De todos modos, encontré que cuando usamos el nuevo dll administrado de Oracle no experimentamos el error (por ejemplo, este es el Oracle.ManagedDataAccess.dll). Por lo tanto, el problema parece estar limitado a las versiones no administradas de la dll (por ejemplo, Oracle.DataAccess.dll). De todos modos, gracias por tu publicación sobre esto, siempre es bueno saber que alguien más está teniendo el mismo problema que tú :). – dcp

0

Por lo que vale, acabo de encontrar este error. El problema era un OracleType incorrecto en uno de mis parámetros. El tipo se configuró en NVarchar y la columna de la base de datos se cambió a Clob.

Intente definir explícitamente su parámetro OracleType.

OracleParameter(string name, OracleType oracleType) 
3

Recibo el mismo mensaje de error. En mi caso, fue porque estaba pasando una cadena vacía a una columna CLOB. Normalmente pasaba un documento XML grande pero a veces no había ningún documento. Ahora, busco cadena vacía y escribo "vacío".

-1

El problema fue una columna que aceptaba nulos con el tipo de datos nchar(2). No acepta nulo, pero requiere que se pasen algunos valores al insertar datos.

+0

Probablemente esta hubiera sido una respuesta mucho mejor si ha proporcionado un ejemplo. – Nae

Cuestiones relacionadas