Как я могу просто получить IfxBlob из запроса Informix в .net? - PullRequest
1 голос
/ 22 апреля 2009

Кажется, я не могу найти способ получить только объект локатора столбца в .Net. Похоже, что Informix автоматически конвертирует столбец BLOB-объекта в Byte [] и не оставляет возможности изменить это поведение.

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

Результаты:

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

Я ожидал:

IBM.Data.Informix.IfxBlob

или что-то подобное.

1 Ответ

1 голос
/ 25 апреля 2009

Я спросил коллегу об этом, и это его ответ мне. Поскольку это не моя ручная работа, я сделал ответ «Сообщество вики», поэтому я не получаю кредит (не зная, где спросить).


Чтобы ответить на вопрос ... следующая программа была написана с использованием Common Informix Provider (IBM.Data.Informix.dll, которая использует протокол связи DRDA ... вы можете получить ее в "Драйвер IBM Data Server для CLI, ODBC и .NET "). Нечто очень похожее должно быть в состоянии сделать с прежним поставщиком Informix (IBM.Data.Informix.dll, который использует протокол связи SQLI ... вы можете получить его в пакете "Informix Client SDK").

Вот пример программы:

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

А вот вывод, который он генерирует:

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

Метод IfxDataReader.GetValue(int) возвращает значение столбца в собственном типе данных .NET Framework. Чтобы получить значение столбца, возвращаемое как тип Informix, вы должны запросить его возвращение как таковое, вызвав метод GetIfxValue(int) или, если вы можете быть более точным, методом GetIfxClob(int).

...