我正在使用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号之间将执行另一个插入,这将导致错误。
答案 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;
}