<docs>
<class>
	<summary>
	Automatically generates single-table commands used to reconcile changes made to a DataSet with the associated MySQL database. This class cannot be inherited.
	</summary>
	<remarks>
	<para>The <see cref="MySqlDataAdapter"/> does not automatically generate the SQL statements required to 
	reconcile changes made to a <see cref="System.Data.DataSet">DataSet</see> with the associated instance of MySQL. 
	However, you can create a <B>MySqlCommandBuilder</B> object to automatically generate SQL statements for 
	single-table updates if you set the <see cref="MySqlDataAdapter.SelectCommand">SelectCommand</see> property 
	of the <B>MySqlDataAdapter</B>. Then, any additional SQL statements that you do not set are generated by the 
	<B>MySqlCommandBuilder</B>.</para>

	<para>The <B>MySqlCommandBuilder</B> registers itself as a listener for <see cref="MySqlDataAdapter.OnRowUpdating">RowUpdating</see> 
	events whenever you set the <see cref="DataAdapter"/> property. You can only associate one 
	<B>MySqlDataAdapter</B> or <B>MySqlCommandBuilder</B> object with each other at one time.</para>

	<para>To generate INSERT, UPDATE, or DELETE statements, the <B>MySqlCommandBuilder</B> uses the 
	<B>SelectCommand</B> property to retrieve a required set of metadata automatically. If you change 
	the <B>SelectCommand</B> after the metadata has is retrieved (for example, after the first update), you 
	should call the <see cref="RefreshSchema"/> method to update the metadata.</para>

	<para>The <B>SelectCommand</B> must also return at least one primary key or unique 
	column. If none are present, an <I>InvalidOperation</I> exception is generated, 
	and the commands are not generated.</para>

	<para>The <B>MySqlCommandBuilder</B> also uses the <see cref="MySqlCommand.Connection">Connection</see>, 
	<see cref="MySqlCommand.CommandTimeout">CommandTimeout</see>, and <see cref="MySqlCommand.Transaction">Transaction</see>
	properties referenced by the <B>SelectCommand</B>. The user should call 
	<B>RefreshSchema</B> if any of these properties are modified, or if the 
	<B>SelectCommand</B> itself is replaced. Otherwise the <see cref="MySqlDataAdapter.InsertCommand">InsertCommand</see>, 
	<see cref="MySqlDataAdapter.UpdateCommand">UpdateCommand</see>, and
	<see cref="MySqlDataAdapter.DeleteCommand">DeleteCommand</see> properties retain 
	their previous values.</para>

	<para>If you call <i>Dispose</i>, the <B>MySqlCommandBuilder</B> is disassociated 
	from the <B>MySqlDataAdapter</B>, and the generated commands are no longer used.
	</para>
	
	<note>
	Caution must be used when using MySqlCOmmandBuilder on MySql 4.0 systems.  With MySql 4.0, 
	database/schema information is not provided to the connector for a query.  This means that
	a query that pulls columns from two identically named tables in two or more different databases
	will not cause an exception to be thrown but will not work correctly.  Even more dangerous
	is the situation where your select statement references database X but is executed in 
	database Y and both databases have tables with similar layouts.  This situation can cause
	unwanted changes or deletes.
	This note does not apply to MySQL versions 4.1 and later.
	</note>
	
	</remarks>

	<example>
		The	following example uses the <see cref="MySqlCommand"/>, along 
		<see cref="MySqlDataAdapter"/> and <see cref="MySqlConnection"/>, to 
		select rows from a data source. The example is passed an initialized 
		<see cref="System.Data.DataSet"/>, a connection string, a 
		query string that is a SQL SELECT statement, and a string that is the 
		name of the database table. The example then creates a <B>MySqlCommandBuilder</B>.
		
		<code lang="Visual Basic">
	Public Shared Function SelectRows(myConnection As String, mySelectQuery As String, myTableName As String) As DataSet
		Dim myConn As New MySqlConnection(myConnection)
		Dim myDataAdapter As New MySqlDataAdapter()
		myDataAdapter.SelectCommand = New MySqlCommand(mySelectQuery, myConn)
		Dim cb As SqlCommandBuilder = New MySqlCommandBuilder(myDataAdapter)

		myConn.Open()

		Dim ds As DataSet = New DataSet
		myDataAdapter.Fill(ds, myTableName)

		' Code to modify data in DataSet here 

		' Without the MySqlCommandBuilder this line would fail.
		myDataAdapter.Update(ds, myTableName)

		myConn.Close()
	End Function 'SelectRows
		</code>
		<code lang="C#">
	public static DataSet SelectRows(string myConnection, string mySelectQuery, string myTableName)
	{
	MySqlConnection myConn = new MySqlConnection(myConnection);
	MySqlDataAdapter myDataAdapter = new MySqlDataAdapter();
	myDataAdapter.SelectCommand = new MySqlCommand(mySelectQuery, myConn);
	MySqlCommandBuilder cb = new MySqlCommandBuilder(myDataAdapter);

	myConn.Open();

	DataSet ds = new DataSet();
	myDataAdapter.Fill(ds, myTableName);

	//code to modify data in DataSet here

	//Without the MySqlCommandBuilder this line would fail
	myDataAdapter.Update(ds, myTableName);

	myConn.Close();

	return ds;
	}

		</code>
	</example>
</class>

<Ctor>
	<summary>
	Initializes a new instance of the <see cref="MySqlCommandBuilder"/> class.
	</summary>
</Ctor>

<Ctor1>
	<summary>
	Initializes a new instance of the <see cref="MySqlCommandBuilder"/> class 
	and sets the last one wins property.
	</summary>
	<param name="lastOneWins">False to generate change protection code.  True otherwise.</param>
	<remarks>
	<para>
	The <i>lastOneWins</i> parameter indicates whether SQL code should be included
	with the generated DELETE and UPDATE commands that checks the underlying data
	for changes.  If <i>lastOneWins</i> is true then this code is not included and
	data records could be overwritten in a multi-user or multi-threaded environments.
	Setting <i>lastOneWins</i> to false will include this check which will cause a
	concurrency exception to be thrown if the underlying data record has changed without
	our knowledge.
	</para>
	</remarks>
</Ctor1>

<Ctor2>
	<summary>
	Initializes a new instance of the <see cref="MySqlCommandBuilder"/> class 
	with the associated <see cref="MySqlDataAdapter"/> object.
	</summary>
	<param name="adapter">The <see cref="MySqlDataAdapter"/> to use.</param>
	<remarks>
	<para>
		The <see cref="MySqlCommandBuilder"/> registers itself as a listener for 
		<see cref="MySqlDataAdapter.RowUpdating"/> events that are generated by the 
		<see cref="MySqlDataAdapter"/> specified in this property.
	</para>
	<para>
		When you create a new instance <B>MySqlCommandBuilder</B>, any existing 
		<B>MySqlCommandBuilder</B> associated with this <B>MySqlDataAdapter</B> 
		is released.
	</para>
	</remarks>
</Ctor2>

<Ctor3>
	<summary>
	Initializes a new instance of the <see cref="MySqlCommandBuilder"/> class 
	with the associated <see cref="MySqlDataAdapter"/> object.
	</summary>
	<param name="adapter">The <see cref="MySqlDataAdapter"/> to use.</param>
	<param name="lastOneWins">False to generate change protection code.  True otherwise.</param>
	<remarks>
	<para>
		The <see cref="MySqlCommandBuilder"/> registers itself as a listener for 
		<see cref="MySqlDataAdapter.RowUpdating"/> events that are generated by the 
		<see cref="MySqlDataAdapter"/> specified in this property.
	</para>
	<para>
		When you create a new instance <B>MySqlCommandBuilder</B>, any existing 
		<B>MySqlCommandBuilder</B> associated with this <B>MySqlDataAdapter</B> 
		is released.
	</para>
	<para>
	The <i>lastOneWins</i> parameter indicates whether SQL code should be included
	with the generated DELETE and UPDATE commands that checks the underlying data
	for changes.  If <i>lastOneWins</i> is true then this code is not included and
	data records could be overwritten in a multi-user or multi-threaded environments.
	Setting <i>lastOneWins</i> to false will include this check which will cause a
	concurrency exception to be thrown if the underlying data record has changed without
	our knowledge.
	</para>
	</remarks>
</Ctor3>

<DataAdapter>
	<summary>
	Gets or sets a <see cref="MySqlDataAdapter"/> object for which SQL statements are automatically generated.
	</summary>
	<value>
	A <see cref="MySqlDataAdapter"/> object.
	</value>
	<remarks>
	<para>
	The <see cref="MySqlCommandBuilder"/> registers itself as a listener for 
	<see cref="MySqlDataAdapter.RowUpdating"/> events that are generated by the 
	<see cref="MySqlDataAdapter"/> specified in this property.
	</para>
	<para>
	When you create a new instance <B>MySqlCommandBuilder</B>, any existing 
	<B>MySqlCommandBuilder</B> associated with this <B>MySqlDataAdapter</B> 
	is released.
	</para>
	</remarks>
</DataAdapter>

<QuotePrefix>
	<summary>
	Gets or sets the beginning character or characters to use when specifying MySQL 
	database objects (for example, tables or columns) whose names contain 
	characters such as spaces or reserved tokens.
	</summary>
	<value>
	The beginning character or characters to use.  The default value is `.
	</value>
	<remarks>
	Database objects in MySQL can contain special characters such as spaces that would
	make normal SQL strings impossible to correctly parse.  Use of the <b>QuotePrefix</b>
	and the <see cref="QuoteSuffix"/> properties allows the <see cref="MySqlCommandBuilder"/>
	to build SQL commands that handle this situation.
	</remarks>
</QuotePrefix>

<QuoteSuffix>
	<summary>
	Gets or sets the beginning character or characters to use when specifying MySQL 
	database objects (for example, tables or columns) whose names contain 
	characters such as spaces or reserved tokens.
	</summary>
	<value>
	The beginning character or characters to use.  The default value is `.
	</value>
	<remarks>
	Database objects in MySQL can contain special characters such as spaces that would
	make normal SQL strings impossible to correctly parse.  Use of the <see cref="QuotePrefix"/>
	and the <b>QuoteSuffix</b> properties allows the <see cref="MySqlCommandBuilder"/>
	to build SQL commands that handle this situation.
	</remarks>
</QuoteSuffix>

<DeriveParameters>
	<summary>
	
	</summary>
	<remarks>
	</remarks>
</DeriveParameters>

<GetDeleteCommand>
	<summary>
	Gets the automatically generated <see cref="MySqlCommand"/> object 
	required to perform deletions on the database.
	</summary>
	<returns>
	The <see cref="MySqlCommand"/> object generated to handle delete operations.
	</returns>
	<remarks>
	<para>
	An application can use the <B>GetDeleteCommand</B> method for informational 
	or troubleshooting purposes because it returns the <see cref="MySqlCommand"/>
	object to be executed.
	</para>
	<para>
	You can also use <B>GetDeleteCommand</B> as the basis of a modified command. 
	For example, you might call <B>GetDeleteCommand</B> and modify the 
	<see cref="MySqlCommand.CommandTimeout"/> value, and then explicitly set that on the 
	<see cref="MySqlDataAdapter"/>.
	</para>
	<para>
	After the SQL statement is first generated, the application must explicitly 
	call <see cref="RefreshSchema"/> if it changes the statement in any way. 
	Otherwise, the <B>GetDeleteCommand</B> will be still be using information 
	from the previous statement, which might not be correct. The SQL statements 
	are first generated either when the application calls 
	<see cref="System.Data.Common.DataAdapter.Update"/> or <B>GetDeleteCommand</B>.
	</para>
	</remarks>
</GetDeleteCommand>

<GetInsertCommand>
	<summary>
	Gets the automatically generated <see cref="MySqlCommand"/> object 
	required to perform insertions on the database.
	</summary>
	<returns>
	The <see cref="MySqlCommand"/> object generated to handle insert operations.
	</returns>
	<remarks>
	<para>
	An application can use the <B>GetInsertCommand</B> method for informational 
	or troubleshooting purposes because it returns the <see cref="MySqlCommand"/>
	object to be executed.
	</para>
	<para>
	You can also use the <B>GetInsertCommand</B> as the basis of a modified command. 
	For example, you might call <B>GetInsertCommand</B> and modify the 
	<see cref="MySqlCommand.CommandTimeout"/> value, and then explicitly set that on the 
	<see cref="MySqlDataAdapter"/>.
	</para>
	<para>
	After the SQL statement is first generated, the application must explicitly 
	call <see cref="RefreshSchema"/> if it changes the statement in any way. 
	Otherwise, the <B>GetInsertCommand</B> will be still be using information 
	from the previous statement, which might not be correct. The SQL statements 
	are first generated either when the application calls 
	<see cref="System.Data.Common.DataAdapter.Update"/> or <B>GetInsertCommand</B>.
	</para>
	</remarks>
</GetInsertCommand>

<GetUpdateCommand>
	<summary>
	Gets the automatically generated <see cref="MySqlCommand"/> object 
	required to perform updates on the database.
	</summary>
	<returns>
	The <see cref="MySqlCommand"/> object generated to handle update operations.
	</returns>
	<remarks>
	<para>
	An application can use the <B>GetUpdateCommand</B> method for informational 
	or troubleshooting purposes because it returns the <see cref="MySqlCommand"/>
	object to be executed.
	</para>
	<para>
	You can also use <B>GetUpdateCommand</B> as the basis of a modified command. 
	For example, you might call <B>GetUpdateCommand</B> and modify the 
	<see cref="MySqlCommand.CommandTimeout"/> value, and then explicitly set that on the 
	<see cref="MySqlDataAdapter"/>.
	</para>
	<para>
	After the SQL statement is first generated, the application must explicitly 
	call <see cref="RefreshSchema"/> if it changes the statement in any way. 
	Otherwise, the <B>GetUpdateCommand</B> will be still be using information 
	from the previous statement, which might not be correct. The SQL statements 
	are first generated either when the application calls 
	<see cref="System.Data.Common.DataAdapter.Update"/> or <B>GetUpdateCommand</B>.
	</para>
	</remarks>
</GetUpdateCommand>

<RefreshSchema>
	<summary>
	Refreshes the database schema information used to generate INSERT, UPDATE, or 
	DELETE statements.
	</summary>
	<remarks>
	<para>
	An application should call <B>RefreshSchema</B> whenever the SELECT statement 
	associated with the <see cref="MySqlCommandBuilder"/> changes.
	</para>
	<para>
	An application should call <B>RefreshSchema</B> whenever the 
	<see cref="MySqlDataAdapter.SelectCommand"/> value of the <see cref="MySqlDataAdapter"/> changes.
	</para>
	</remarks>
</RefreshSchema>

</docs>