10bet网址
MySQL连接器/ NET开发人员指南
相关文件10bet官方网站 下载本手册

MySQL连接器/ NET开发人员指南/连接器/网常见问题

第10章连接器/ NET FAQ

问题

  • 10.1:是否在事务开始在交易中自动启动后执行的所有命令?

  • 10.2:如何获得自动递增列的值?

问题与解答

10.1:是否在事务开始在交易中自动启动后执行的所有命令?

是的。当客户端在Classic MySQL中开始事务时,所有后续命令(在该连接上)都是该事务的一部分,直到客户端提交或滚动事务。要在该事务之外执行命令,必须打开单独的连接。

10.2:如何获得自动递增列的值?

使用时commandbuilder., 环境returngeneratedideniers.财产真的不再有效,如commandbuilder.不添加last_insert_id()默认。

commandbuilder挂钩到了dataadapter.rowupdating.事件处理程序,这意味着它被调用了每一行。它检查命令对象,如果它是相同的引用对象,它基本上重建对象,从而销毁命令文本更改。

解决此问题的一种方法是克隆命令对象,因此您有一个不同的实际参考:

dataAdapter.insertCommand = CB.GetInsertCommand()。克隆()

这是作品,但由于CommandBuilder仍然连接到DataAdapter,因此Rowupdating事件仍然触发,对性能产生不利影响。要停止,一旦添加了所有命令,您需要断开CommandBuilder与DataAdapter的连接:

cb.dataAdapter = null;

最后一个要求是确保ID返回last_insert_id()有正确的名称。例如:

选择last_insert_id()作为id

这里显示了一个完整的工作示例:

使用系统;使用system.collections.generic;使用system.linq;使用system.text;使用system.data;使用mysql.data;使用mysql.data.mysqllient;命名空间getautoincid {class程序{静态void main(String [] args){string connstr =“server = localhost; user = root; database = testdb; port = 3306; password = ******;”;mysqlconnection conn = new mysqlconnection(connstr);尝试{console.writeline(“连接到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."); } } }