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)
.
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.) –
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