Spec-Zone .ru
спецификации, руководства, описания, API
|
Вопросы
23.2.11.1: Как я получаю значение автопостепенно увеличенного столбца?
Вопросы и Ответы
23.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."); } }}