Глава 10. Connector/NET FAQ
Questions and Answers
10.1:
Все команды, выполняемые после
того, как транзакция начинается, автоматически включены в транзакцию?
Да. Когда клиент начинает транзакцию в классическом MySQL, все последующие
команды (на той связи) являются частью той транзакции, пока клиент не
передает или откатывает транзакцию до прежнего уровня.
Чтобы выполнить команду за пределами этой транзакции, необходимо
открыть отдельную связь.
10.2:
Как я получаю значение столбца autoincrement?
При использовании 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.");
}
}
}
|