代码之家  ›  专栏  ›  技术社区  ›  hometoast

如何才能从.net中的am informix query获取ifxblob?

  •  1
  • hometoast  · 技术社区  · 15 年前

    我似乎找不到只获取.net下某列的locator对象的方法。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 回复  |  直到 12 年前
        1
  •  1
  •   Jonathan Leffler    12 年前

    我问了一位同事这个问题,这是他对我的回应。因为这不是我的工作,我已经做了答案“社区维基”,所以我没有得到学分(除了知道在哪里问)。


    为了回答这个问题…下面的程序是使用通用informix提供程序(使用drda通信协议的ibm.data.informix.dll)编写的……您可以在“ibm data server driver for cli、odbc和.net”包中获得它。对于遗留的informix提供程序(使用sqli通信协议的ibm.data.informix.dll),应该可以做一些非常类似的事情……您可以在“informix客户端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) 方法。