我看MySQL自带的C#例子程序,其中有
MySqlCommandBuilder cb; 
cb = new MySqlCommandBuilder( da );
这样的东西。
奇怪的是,这个cb没有被其他代码用过,就孤零零地放在那里。
我想知道,1.这个cb的用途是什么?2.它没有被其他代码用到,那是怎么起作用的?
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using MySql.Data.MySqlClient;namespace TableEditor
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.ComboBox tables;
private System.Windows.Forms.TextBox server;
private System.Windows.Forms.TextBox userid;
private System.Windows.Forms.TextBox password;
private System.Windows.Forms.Button connectBtn;
private System.Windows.Forms.Button updateBtn;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.ComboBox databaseList;
private System.Windows.Forms.Label label5; private MySqlConnection conn;
private DataTable data;
private MySqlDataAdapter da;
private System.Windows.Forms.DataGrid dataGrid;
private MySqlCommandBuilder cb; public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent(); //
// TODO: Add any constructor code after InitializeComponent call
//
} /// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
} #region Windows Form Designer generated code
#endregion /// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form1());
} private void connectBtn_Click(object sender, System.EventArgs e)
{
if (conn != null)
conn.Close();

string connStr = String.Format("server={0};user id={1}; password={2}; database=mysql; pooling=false",
server.Text, userid.Text, password.Text ); try 
{
conn = new MySqlConnection( connStr );
conn.Open(); GetDatabases();
}
catch (MySqlException ex) 
{
MessageBox.Show( "Error connecting to the server: " + ex.Message );
}
} private void GetDatabases() 
{
MySqlDataReader reader = null; MySqlCommand cmd = new MySqlCommand("SHOW DATABASES", conn);
try 
{
reader = cmd.ExecuteReader();
databaseList.Items.Clear();
while (reader.Read()) 
{
databaseList.Items.Add( reader.GetString(0) );
}
}
catch (MySqlException ex) 
{
MessageBox.Show("Failed to populate database list: " + ex.Message );
}
finally 
{
if (reader != null) reader.Close();
}
} private void databaseList_SelectedIndexChanged(object sender, System.EventArgs e)
{
MySqlDataReader reader = null; conn.ChangeDatabase( databaseList.SelectedItem.ToString() ); MySqlCommand cmd = new MySqlCommand("SHOW TABLES", conn);
try 
{
reader = cmd.ExecuteReader();
tables.Items.Clear();
while (reader.Read()) 
{
tables.Items.Add( reader.GetString(0) );
}
}
catch (MySqlException ex) 
{
MessageBox.Show("Failed to populate table list: " + ex.Message );
}
finally 
{
if (reader != null) reader.Close();
}
} private void tables_SelectedIndexChanged(object sender, System.EventArgs e)
{
data = new DataTable();

da = new MySqlDataAdapter("SELECT * FROM " + tables.SelectedItem.ToString(), conn );
cb = new MySqlCommandBuilder( da ); da.Fill( data ); dataGrid.DataSource = data;
} private void updateBtn_Click(object sender, System.EventArgs e)
{
DataTable changes = data.GetChanges();
da.Update( changes );
data.AcceptChanges();
}
}
}