2009-04-22 4 views
1

Je n'arrive pas à trouver un moyen d'obtenir juste l'objet localisateur d'une colonne sous .Net. Il semble qu'Informix convertit automatiquement la colonne blob en Byte [] et ne laisse aucun moyen de modifier ce comportement.Comment puis-je obtenir un IfxBlob à partir d'une requête Informix dans .net?

IBM.Data.Informix.IfxConnection c = 
      new IBM.Data.Informix.IfxConnection("..."); 
c.Open(); 
IBM.Data.Informix.IfxCommand cmd = 
      new IBM.Data.Informix.IfxCommand("SELECT id,data FROM aaa", c); 
IBM.Data.Informix.IfxDataReader r = cmd.ExecuteReader(); 
while (r.Read()) { 
    Debug.WriteLine(r.GetValue(1).GetType()); 
} 

c.Close(); 

résultats:

System.Byte[] 
System.Byte[] 
System.DBNull 
System.DBNull 

I expected:

IBM.Data.Informix.IfxBlob 

ou quelque chose de similaire.

+0

Quel est le type de la colonne dans le tableau de la base de données? Si c'est BYTE ou BLOB, alors pourquoi aurait-on besoin d'inventer un type IBM.Data.Informix.IfxBlob à la place? (Il peut y avoir de bonnes raisons, je ne suis pas un expert en .NET.) –

+0

Le type est "créer une table aaa (id série, données blob) mettre des données dans 'sbspace' IfxBlob est un type dans le pilote .Net Ce que je veux faire est de savoir s'il y a un blob, mais l'obtenir à la demande, effectivement charger paresseusement les données.Le changement du schéma est hors de question car c'est un très grand système hérité. – hometoast

Répondre

1

J'ai demandé à un collègue à ce sujet, et c'est sa réponse à moi. Comme ce n'est pas mon travail, j'ai fait la réponse 'Community Wiki' donc je n'ai pas le crédit (au-delà de savoir où demander).


Pour répondre à la question ... le programme suivant a été écrit en utilisant le fournisseur commun Informix (le IBM.Data.Informix.dll qui utilise le protocole de communication DRDA ... vous pouvez l'obtenir dans le « IBM Pilote de serveur de données pour CLI, ODBC et .NET "). Quelque chose de très similaire devrait pouvoir être fait avec le fournisseur Informix Legacy (IBM.Data.Informix.dll qui utilise le protocole de communication SQLI ... vous pouvez l'obtenir dans le paquet "Informix Client SDK").

Voici un exemple de programme:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Data; 
using IBM.Data.Informix; 

namespace InformixClob 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     try 
     { 
      IfxConnection tConn = new IfxConnection("database=idsdb;server=my-system:9089;uid=informix;pwd=********"); 
      tConn.Open(); 

      IfxCommand tCmd = tConn.CreateCommand(); 
      // create table mytesttab (col1 integer, col2 clob) 
      tCmd.CommandText = "select * from mytesttab"; 
      IfxDataReader tRdr = tCmd.ExecuteReader(); 
      while (tRdr.Read()) 
      { 
       Console.WriteLine("Col1 is a {0}", tRdr.GetValue(0).GetType()); 
       Console.WriteLine("Col2(GetValue) is a {0}", tRdr.GetValue(1).GetType()); 
       Console.WriteLine("Col2(GetIfxValue) is a {0}", tRdr.GetIfxValue(1).GetType()); 
       Console.WriteLine("Col2(GetIfxClob) is a {0}", tRdr.GetIfxClob(1).GetType()); 
      } 
      tRdr.Close(); 
      tConn.Close(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 
     finally 
     { 
      Console.Write("Press ENTER"); Console.ReadLine(); 
     } 
     } 
    } 
} 

Et voici la sortie qu'il génère:

Col1 is a System.Int32 
Col2(GetValue) is a System.String 
Col2(GetIfxValue) is a IBM.Data.Informix.IfxClob 
Col2(GetIfxClob) is a IBM.Data.Informix.IfxClob 
Press ENTER 

La méthode IfxDataReader.GetValue(int) va renvoyer la valeur de la colonne dans un type de données natif .NET Framework. Pour obtenir la valeur de colonne renvoyée en tant que type Informix, vous devez demander qu'elle soit renvoyée en tant que telle en appelant la méthode GetIfxValue(int) ou, si vous pouvez être plus précis, par la méthode GetIfxClob(int).

Questions connexes