Spec-Zone .ru
спецификации, руководства, описания, API

21.2.11. FAQ соединителя/Сети

Вопросы

Вопросы и Ответы

22.2.11.1: Как я получаю значение автопостепенно увеличенного столбца?

При использовании CommandBuilder, установка ReturnGeneratedIdentifiers свойство к true больше работы, как CommandBuilder не добавляет last_insert_id() по умолчанию.

CommandBuilder сцепляется до DataAdapter.RowUpdating обработчик событий, что означает это, будет требоваться каждая строка. Это исследует объект команды и, если это - тот же самый объект, на который ссылаются, это по существу восстанавливает объект, таким образом уничтожая Ваши текстовые изменения команды.

Один подход к решению этой проблемы должен клонировать объект команды, таким образом, у Вас есть различная фактическая ссылка:

dataAdapter.InsertCommand = cb.GetInsertCommand().Clone()

Это будет работать, но так как CommandBuilder все еще соединяется с DataAdapter, событие RowUpdating будет все еще стрелять, и производительность будет поражена. Чтобы остановить это, как только все Ваши команды были добавлены, Вы должны разъединить CommandBuilder от DataAdapter:

cb.DataAdapter = null;

Последнее требование должно удостовериться id это возвращается last_insert_id() имеет корректное имя. Например:

SELECT last_insert_id() AS id

Полный рабочий пример показывают здесь:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using MySql.Data;using MySql.Data.MySqlClient;namespace GetAutoIncId{    class Program    {        static void Main(string[] args)        {            string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******;";            MySqlConnection conn = new MySqlConnection(connStr);            try            {                Console.WriteLine("Connecting to MySQL...");                conn.Open();                string sql = "SELECT * FROM TestTable";                MySqlDataAdapter da = new MySqlDataAdapter(sql, conn);                MySqlCommandBuilder cb = new MySqlCommandBuilder(da);                MySqlCommand cmd = new MySqlCommand();                cmd.Connection = conn;                cmd.CommandText = sql;                // use Cloned object to avoid .NET rebuilding the object, and                 // thereby throwing away our command text additions.                MySqlCommand insertCmd = cb.GetInsertCommand().Clone();                 insertCmd.CommandText = insertCmd.CommandText + ";SELECT last_insert_id() AS id";                insertCmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;                da.InsertCommand = insertCmd;                cb.DataAdapter = null; // Unhook RowUpdating event handler                DataTable dt = new DataTable();                da.Fill(dt);                DataRow row = dt.NewRow();                row["name"] = "Joe Smith";                dt.Rows.Add(row);                da.Update(dt);                System.Console.WriteLine("ID after update: " + row["id"]);            }            catch (Exception ex)            {                Console.WriteLine(ex.ToString());            }            conn.Close();            Console.WriteLine("Done.");        }    }}