2010-01-06 15 views
7

Sto cercando di parametrizzare tutto il nostro SQL esistente, ma il seguente codice mi sta dando un problema:Qual è l'OracleType di ROWNUM

command.CommandText = String.Format("SELECT * FROM({0}) 
     WHERE ROWNUM <= :maxRecords", command.CommandText); 
command.Parameters 
     .Add("maxRecords", OracleType.Int32).Value = maxRecords; 

L'errore segnalato è "ORA-01036: illegale nome/numero variabile ".

Presumo che ciò sia dovuto al fatto che OracleType.Int32 non è il tipo di dati corretto per ROWNUM. Quindi, cos'è?

risposta

6

In SQLPlus siamo in grado di creare una vista che include rownum di vedere esattamente ciò che tipo di dati Oracle utilizza:

TEST>create view v_test as select rownum rn, dummy from dual; 

View created. 

TEST>desc v_test 
Name  Null? Type 
-------- -------- ------------- 
RN    NUMBER 
DUMMY    VARCHAR2(1) 

Quindi, per Oracle, questo pseudocolonna è un numero. Quale base a questo link (http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#i16209) può contenere:

The following numbers can be stored in a NUMBER column: 

-Positive numbers in the range 1 x 10^-130 to 9.99...9 x 10^125 with up to 38 significant digits 
-Negative numbers from -1 x 10^-130 to 9.99...99 x 10^125 with up to 38 significant digits 
-Zero 
-Positive and negative infinity (generated only by importing from an Oracle Database, Version 5) 
1

Credo che OracleType.Number funzionerà se il tipo di dati è il problema.

1

Buona domanda. Hai provato: OracleType.UInt32? Vorrei provare OracleType.Number come ultima risorsa.

0

tutti Siamo spiacenti, il problema non è il tipo di dati. è perché l'oggetto comando viene utilizzato più volte nel codice del metodo per eseguire sql diversi, con parametri diversi. Chiamando command.Parameters.Clear() dopo la mia chiamata ha risolto il problema. Mille grazie per l'approfondimento su come trovare un DataType. Sarà utile per ulteriori riferimenti.