Domanda

Non riesco a trovare un modo per ottenere solo l'oggetto localizzatore di una colonna in .Net. Sembra che Informix sta convertendo automaticamente la colonna blob di byte [] e non lasciando un modo per cambiare questo comportamento.

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();

Risultati:

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

mi aspettavo:

IBM.Data.Informix.IfxBlob

o qualcosa di simile.

È stato utile?

Soluzione

Ho chiesto a un collega su questo, e questa è la sua risposta a me. Dato che non è la mia opera, ho fatto la risposta 'Wiki' quindi non si ottiene il credito (al di là di sapere dove chiedere).


Per rispondere alla domanda ... il seguente programma è stato scritto utilizzando il provider Common Informix (l'IBM.Data.Informix.dll che utilizza il protocollo di comunicazione DRDA ... si può ottenere nella "IBM Data Server Driver per CLI, ODBC, e .NET" pacchetto). Qualcosa di molto simile dovrebbe essere in grado di essere fatto con il provider Legacy Informix (l'IBM.Data.Informix.dll che utilizza il protocollo di comunicazione SQLI ... si può ottenere nel pacchetto "Informix Client SDK").

Ecco un esempio di programma:

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();
         }
      }
   }
}

Ed ecco l'output che genera:

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

Il metodo IfxDataReader.GetValue(int) sta per restituire il valore della colonna in un tipo di dati nativo .NET Framework. Per ottenere il valore della colonna restituito come un tipo di Informix, è necessario richiedere che venga restituito come tale da una chiamata al metodo GetIfxValue(int), o se si può essere più specifico, con il metodo GetIfxClob(int).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top