C #: как получить идентификационный номер последней строки, вставленной с помощью Informix - PullRequest
2 голосов
/ 04 октября 2010

Я использую драйвер Informix.NET (C #) для вставки строки в таблицу базы данных.Это прекрасно работает, за исключением того, что я не знаю, как получить идентификатор последней вставленной строки:

Команда вставки:

    //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;
        }
    }

Если я изменю запрос такчто оно включает: «ВЫБЕРИТЕ DBINFO ('sqlca.sqlerrd1') ОТ systables WHERE tabid = 1;"Я получаю ошибки (эта строка работает с использованием unix dbaccess) Я получаю ошибки.

Я также пытался изменить такие вещи, как использование IFX::IfxReader reader = command.ExecuteReader(), чтобы попытаться получить результаты и прочитать их, однако я получаю ошибки,(«ОШИБКА [HY000] [Поставщик Informix .NET] [Informix] Невозможно использовать оператор выбора или какой-либо из операторов базы данных при подготовке нескольких запросов.»).Я также пытался предшествовать этому с command.Prepare();, но это ничего не делает.Я действительно не уверен, как сделать вставку и получить идентификатор через C # Informix.NET Client SDK.

=========
О, и я знаю, что могу запуститьдва оператора по отдельности, которые будут работать, за исключением того, что я беспокоюсь о том, что будет выполнена другая вставка между первым и получением идентификационного номера, что приведет к ошибкам.

Ответы [ 4 ]

2 голосов
/ 04 октября 2010

Конечно, я никогда раньше не использовал этот фреймворк, но мне это было нужно в другом фреймворке, с которым я работал, поэтому в итоге я сделал совершенно отдельный запрос, чтобы получить идентификатор нового элемента.

Мой код был на 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 вы, вероятно, могли бы создать оператор Select, который использует информацию из оператора Insert.

0 голосов
/ 07 ноября 2016

Рабочий код для 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;
    }
0 голосов
/ 08 мая 2014

Уже на несколько лет позже, но вот запрос, который мы используем, который работает:

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
0 голосов
/ 30 марта 2012

Мой ответ в C # с использованием базы данных Oracle, учитывая, что в таблице «testtable» есть столбец «ID», так как 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);


    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...