none
No entiendo SqlCommandBuilder RRS feed

  • Pregunta

  • Alguien me puede ayudar x favor.. por que razon depues de ejecutar el siguiente codigo
    el  o los registros q corresponde a FirstName='Anna' no son eliminados del origen d datos?

     

    class Program
        {
            public SqlCommand cm;
            public  SqlConnection cn;
    
            public Program()
            {
                cm = new SqlCommand("SELECT ContactID, FirstName, LastName" +
                                    " FROM Person.Contacto" +
                                    " WHERE FirstName LIKE 'A%'" +
                                    " AND LastName = 'Rodriguez'");
    
                cn = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks;Integrated Security=True");
            }
    
            static void Main(string[] args)
            { 
                Program p = new Program();
                DataSet ds = p.SelectSqlRows(p.cn.ConnectionString, p.cm.CommandText, "Person.Contacto");
                 
            }
    
            public DataSet SelectSqlRows(string connectionString, string queryString, string tableName) 
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = new SqlCommand(queryString, connection);
                    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    
                    connection.Open();
    
                    DataSet dataSet = new DataSet();
                    adapter.Fill(dataSet, tableName);
    
                    DataRow[] dataRow = dataSet.Tables[0].Select("FirstName='Anna'");
    
                    foreach(DataRow dr in dataRow)
                    {
                        dataSet.Tables[0].Rows.Remove(dr);
                    }                
                    
                    adapter.Update(dataSet, tableName);
    
                    return dataSet;
                }
            }
    
    }
    

    Muchas gracias.

    martes, 11 de octubre de 2011 16:59

Respuestas

  • "acuariolo" preguntó:

    > Alguien me puede ayudar x favor.. por que razon depues de
    > ejecutar el siguiente codigo el  o los registros q
    > corresponde a FirstName='Anna' no son eliminados del origen d datos?
    >
    >  SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    >
    >   dataSet.Tables[0].Rows.Remove(dr);


    Hola:

    Pues por dos motivos fundamentales. El primero porque no has configurado las propiedades XXXCommand del adaptador de datos (adapter) con el objeto SqlCommandBuilder. Y el segundo porque para eliminar los objetos DataRow estás llamando a su método 'Remove', y éste llama automáticamente al método 'AcceptChanges' del objeto DataRow, con lo cual se están confirmando los cambios en el objeto DataTable.

    Como los cambios se han confirmado, al llamar al método 'Update' del adaptador de datos, no hay ninguna modificación en el objeto DataTable, con lo cual, no se actualiza la base de datos. ¡Así de fácil! ;-)

    Mejor será que ejecutes tu método 'SelectSqlRows' de la siguiente manera:

           public DataTable SelectSqlRows(string connectionString, string queryString, string tableName)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = new SqlCommand(queryString, connection);
                    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    
                    // Los nombres de los campos se encerrarán entre corchetes
                    //
                    builder.QuotePrefix = "[";
                    builder.QuoteSuffix = "]";
    
                    // Configuramos las propiedades del adaptador de datos
                    //
                    adapter.InsertCommand = builder.GetInsertCommand();
                    adapter.DeleteCommand = builder.GetDeleteCommand();
                    adapter.UpdateCommand = builder.GetUpdateCommand();
    
                    connection.Open();
    
                    DataTable dt = new DataTable(tableName);
                    adapter.Fill(dt);
    
                    DataRow[] dataRow = dt.Select("FirstName='Anna'");
    
                    foreach (DataRow dr in dataRow)
                    {
                        // Llamamos al método Delete del objeto DataRow
                        dr.Delete();
                        
                    }
    
                    adapter.Update(dt);
    
                    return dt;
                }
            }
    

    Fíjate que en lugar de devolver un objeto DataSet, el método devolverá un objeto DataTable, porque para lo que deseas hacer, es más que suficiente. :-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Propuesto como respuesta jtorrecillaModerator martes, 11 de octubre de 2011 18:27
    • Marcado como respuesta acuariolo martes, 11 de octubre de 2011 19:26
    martes, 11 de octubre de 2011 18:25

Todas las respuestas

  • "acuariolo" preguntó:

    > Alguien me puede ayudar x favor.. por que razon depues de
    > ejecutar el siguiente codigo el  o los registros q
    > corresponde a FirstName='Anna' no son eliminados del origen d datos?
    >
    >  SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    >
    >   dataSet.Tables[0].Rows.Remove(dr);


    Hola:

    Pues por dos motivos fundamentales. El primero porque no has configurado las propiedades XXXCommand del adaptador de datos (adapter) con el objeto SqlCommandBuilder. Y el segundo porque para eliminar los objetos DataRow estás llamando a su método 'Remove', y éste llama automáticamente al método 'AcceptChanges' del objeto DataRow, con lo cual se están confirmando los cambios en el objeto DataTable.

    Como los cambios se han confirmado, al llamar al método 'Update' del adaptador de datos, no hay ninguna modificación en el objeto DataTable, con lo cual, no se actualiza la base de datos. ¡Así de fácil! ;-)

    Mejor será que ejecutes tu método 'SelectSqlRows' de la siguiente manera:

           public DataTable SelectSqlRows(string connectionString, string queryString, string tableName)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = new SqlCommand(queryString, connection);
                    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    
                    // Los nombres de los campos se encerrarán entre corchetes
                    //
                    builder.QuotePrefix = "[";
                    builder.QuoteSuffix = "]";
    
                    // Configuramos las propiedades del adaptador de datos
                    //
                    adapter.InsertCommand = builder.GetInsertCommand();
                    adapter.DeleteCommand = builder.GetDeleteCommand();
                    adapter.UpdateCommand = builder.GetUpdateCommand();
    
                    connection.Open();
    
                    DataTable dt = new DataTable(tableName);
                    adapter.Fill(dt);
    
                    DataRow[] dataRow = dt.Select("FirstName='Anna'");
    
                    foreach (DataRow dr in dataRow)
                    {
                        // Llamamos al método Delete del objeto DataRow
                        dr.Delete();
                        
                    }
    
                    adapter.Update(dt);
    
                    return dt;
                }
            }
    

    Fíjate que en lugar de devolver un objeto DataSet, el método devolverá un objeto DataTable, porque para lo que deseas hacer, es más que suficiente. :-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Propuesto como respuesta jtorrecillaModerator martes, 11 de octubre de 2011 18:27
    • Marcado como respuesta acuariolo martes, 11 de octubre de 2011 19:26
    martes, 11 de octubre de 2011 18:25
  • Gracia Enrrique x contestar, pero justo regrese por q encontre una solucion, no tan amplia como la tuya, pero  funciona:

     

    Es importante comprender la diferencia entre eliminar una fila de una DataTable y quitar la fila.Al llamar al método Remove o RemoveAt, la fila se quita inmediatamente.Cualquier fila correspondiente en el origen de datos back end no se verá afectada si a continuación se pasa DataTable o DataSet a DataAdapter y se llama a Update.Al utilizar el método Delete, la fila permanece en DataTable y se marca para eliminación.Si a continuación se pasa DataTable o DataSet a DataAdapter y se llama a Update, la fila correspondiente en el origen de datos back end se elimina.

    .
    .
    .
    int i = 0;
    
                    foreach(DataRow dr in dataRow)
                    {
                        i = dataSet.Tables[0].Rows.IndexOf(dr);
                        dataSet.Tables[0].Rows[i].Delete();
                    }                
                    
                    adapter.Update(dataSet, tableName);
    
                    return dataSet;

    En tu respuesta vienen datos importates , la marcare como respuesta. Gracias

    martes, 11 de octubre de 2011 19:26
  • public DataSet SelectSqlRows(string connectionString, string queryString, string tableName) 
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = new SqlCommand(queryString, connection);
                    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    
                    connection.Open();
    
                    DataSet dataSet = new DataSet();
                    adapter.Fill(dataSet, tableName);
    
                    adapter.FillSchema(dataSet, SchemaType.Source, "Person.Contacto");
                    adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
    
                    DataRow[] dataRow = dataSet.Tables[0].Select("FirstName='Adriana'");
    
                    int i = 0;
    
                    foreach(DataRow dr in dataRow)
                    {
                        i = dataSet.Tables[0].Rows.IndexOf(dr);
                        dataSet.Tables[0].Rows[i].Delete();
                    }                
                    
                    adapter.Update(dataSet, tableName);
    
                    return dataSet;
                }
            }

    martes, 11 de octubre de 2011 19:28