2010-03-23 4 views
3

J'utilise le fournisseur de données spécifiques Oracle (11g), et non le fournisseur Microsoft qui est en cours de suppression. La chose que j'ai trouvé à propos de ODP.NET est à quel point il est difficile avec les types de données. Lorsque JDBC et d'autres fournisseurs d'ADO se contentent de convertir et de faire fonctionner les choses, ODP.NET lancera une exception de transtypage invalide à moins que vous ne l'obteniez exactement.Fournisseur de données Oracle .NET et diffusion

Tenir compte de ce code:

 String strSQL = "SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL"; 

     OracleCommand cmd = new OracleCommand(strSQL, conn); 
     reader = cmd.ExecuteReader(); 
     if (reader != null && reader.Read()) { 
      Int64 id = reader.GetInt64(0); 
      return id; 
     } 

En raison de pickiness de ODP.NET sur la conversion, cela ne fonctionne pas. Mes options habituelles sont:

1) Récupérez dans un Decimal et retournez-le avec un cast à un Int64 (je n'aime pas cela parce que Decimal est juste overkill, et au moins une fois je me souviens d'avoir lu était obsolète ...)

Decimal id = reader.GetDecimal(0); 
return (Int64)id; 

2) Ou jeter dans l'instruction SQL pour vous assurer qu'il intègre dans Int64, comme le nombre (18)

String strSQL = "SELECT CAST(DOCUMENT_SEQ.NEXTVAL AS NUMBER(18)) FROM DUAL"; 

Je ne (2), parce que je me sens juste pas tirer propre un nombre dans un .NET Decimal lorsque mes types de domaine sont Int32 ou Int64. Les autres fournisseurs que j'ai utilisés sont assez intelligents pour faire la conversion à la volée.

Des suggestions des gourous ODP.NET?

+0

En ODP.NET tout type de numéro sera casté type décimal. Ensuite, vous devriez être casté au type approprié Int64 (long), Int16 (court), etc. Peut-être utile n'importe quelle table au sujet de NUMBER (n, p) tapez dans ORACLE et le meilleur type de .NET. – Kiquenet

Répondre

3

Cela fonctionne avec votre SQL d'origine:

Int64 id = System.Convert.ToInt64(reader.GetValue(0)); 
Questions connexes