C#:如何获取使用Informix插入的最后一行的ID号

时间:2010-10-04 17:03:16

标签: c# auto-increment informix

我正在使用Informix.NET驱动程序(C#)将行插入数据库表。这工作正常,但我不知道如何获取最后插入的行的ID:

插入命令:

    //Sample Query: "INSERT INTO names (id, name) values (0, 'John Smith');"
    public static void Insert(String query)
    {
        try
        {
            using (IFX::IfxConnection connection = ConnectionManager.GetConnection())
            {
                connection.Open();

                using (IFX::IfxCommand command = new IFX::IfxCommand(query, connection))
                    command.ExecuteNonQuery();

                if (connection != null) connection.Close();
            }
        }
        catch (IFX::IfxException)
        {
            throw;
        }
        catch (Exception)
        {
            throw;
        }
    }

如果我更改查询以使其包含:“SELECT DBINFO('sqlca.sqlerrd1')FROM systables WHERE tabid = 1;”我得到错误(这行使用unix dbaccess)我得到错误。

我还试图改变一些事情,例如使用IFX::IfxReader reader = command.ExecuteReader()来尝试获取结果并阅读这些结果,但是我得到了错误。 (“ERROR [HY000] [Informix .NET提供程序] [Informix]不能在多查询准备中使用select或任何数据库语句。”)。我也尝试在command.Prepare();之前加入,但这没有任何作用。我真的不确定如何插入并通过C#Informix.NET Client SDK获取ID。

======
哦,我知道我可以单独运行这两个语句,这将有效,除了我担心在第一个和获取ID号之间将执行另一个插入,这将导致错误。

4 个答案:

答案 0 :(得分:2)

当然,我之前从未使用过这个框架,但我确实需要在我使用的不同框架中这样做,所以我最终做的是做一个完全独立的查询来获取新元素的ID。

我的代码是在PHP中,但在伪代码中它看起来像:

Insert(String query)
{
   Execute the Sql Query: query
   result = Execute the Sql Query: "SELECT last_insert_id"
   return the first element of result
}
编辑:我没有注意到你的编辑,这对我来说不是问题因为它是PHP所以它是单线程的,因此在两个查询之间的时间内不可能执行另一个语句。但是,如果向插入添加锁定,则可以强制将两个查询作为事务发生。还有一点RegEx,您可能构造一个使用Insert语句中的信息的Select语句。

答案 1 :(得分:0)

我在C#中使用Oracle数据库的答案,考虑到表“testtable”有一个“ID”列作为带有autoinc序列的PK而字段“testname”是一个varchar字段。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using System.Data;

namespace ConsoleApplication3
{
class Program
{

    public static void Main(string[] args)
    {

        OracleConnection cn = new OracleConnection("your connection string here");


        string sql = "INSERT INTO testtable(testname) VALUES('testing2') RETURNING id INTO :LASTID";
        OracleParameter lastId = new OracleParameter(":LASTID", OracleDbType.Int32);

        lastId.Direction = ParameterDirection.Output;

        using (OracleCommand cmd = new OracleCommand(sql, cn))
        {
            cn.Open();
            cmd.Parameters.Add(lastId);
            cmd.ExecuteNonQuery();
            Console.WriteLine("Last ID: " + lastId.Value.ToString());
            cn.Close();
        }
        Console.WriteLine();
        Console.ReadKey(false);


    }
}
}

答案 2 :(得分:0)

几年太晚了,但我们使用的查询有效:

SELECT MAX(num) AS serial FROM (SELECT DBINFO('sqlca.sqlerrd1') AS num FROM sysmaster:sysdual UNION SELECT DBINFO('serial8') AS num FROM sysmaster:sysdual)

并且,为了完整起见,我们使用的是适用于MS SQL的文件:

SELECT SCOPE_IDENTITY() AS serial

答案 3 :(得分:0)

Informix的工作代码,因为我必须从各种问题中混合以准确回答这个问题

    private int LastInsert(OdbcConnection informixConn)
    {
        string idSerialSQL = "SELECT DBINFO( 'sqlca.sqlerrd1' ) FROM systables WHERE tabid = 1;";
        OdbcCommand queryInformixCmd = new OdbcCommand(idSerialSQL, informixConn);
        int idSerial = (int)queryInformixCmd.ExecuteScalar();
        return idSerial;
    }