RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 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.");
    }
  }
}

Поиск

 

Найди своих коллег!

Вы можете направить письмо администратору этой странички, Алексею Паутову. mailto:alexey.v.pautov@mail.ru