<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="vbnet">
        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>

  <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>


  <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>