Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > как вернуть изменения DataSet в БД


Автор: Чердак 21.10.2008, 01:47
Доброе время суток. 
Вот что есть:

Код

 private string SelectString = @"
            SELECT  *
            FROM    ContractorBasic";
            SqlDataAdapter da = new SqlDataAdapter();
            SqlCommandBuilder bld = new SqlCommandBuilder();  
//.......

SqlDataAdapter da = new SqlDataAdapter(SelectString, ConnectionToSql);
            SqlCommandBuilder bld = new SqlCommandBuilder(da);            
                da.Fill(ds);
                ds.Tables[0].TableName = "NewDataSource";

                dataGridView1.DataSource = ds;
                dataGridView1.DataMember = "NewDataSource";


    private void button3_Click(object sender, EventArgs e)
        {
            
            da.Update(ds.Tables[0]);
             
        }


В гриде вносятся изменения в разные строки таблицы. Необходимо чтобы эти изменения были внесены и в базу. 
 da.Update(ds.Tables[0]); - это видимо неправильно, потомучто ругается. А как тогда?

Автор: Чердак 21.10.2008, 02:20
Ргается вот как: 
Цитата

Update requires a valid UpdateCommand when passed DataRow collection with modified rows.

Автор: Partizan 21.10.2008, 07:50
Чердак, пример из MSDN из статьи Updating Data Sources with DataAdapters (ADO.NET)

Код

private static void AdapterUpdate(string connectionString)
{
    using (SqlConnection connection =
               new SqlConnection(connectionString))
    {
        SqlDataAdapter dataAdpater = new SqlDataAdapter(
          "SELECT CategoryID, CategoryName FROM Categories",
          connection);

        dataAdpater.UpdateCommand = new SqlCommand(
           "UPDATE Categories SET CategoryName = @CategoryName " +
           "WHERE CategoryID = @CategoryID", connection);

        dataAdpater.UpdateCommand.Parameters.Add(
           "@CategoryName", SqlDbType.NVarChar, 15, "CategoryName");

        SqlParameter parameter = dataAdpater.UpdateCommand.Parameters.Add(
          "@CategoryID", SqlDbType.Int);
        parameter.SourceColumn = "CategoryID";
        parameter.SourceVersion = DataRowVersion.Original;

        DataTable categoryTable = new DataTable();
        dataAdpater.Fill(categoryTable);

        DataRow categoryRow = categoryTable.Rows[0];
        categoryRow["CategoryName"] = "New Beverages";

        dataAdpater.Update(categoryTable);

        Console.WriteLine("Rows after update.");
        foreach (DataRow row in categoryTable.Rows)
        {
            {
                Console.WriteLine("{0}: {1}", row[0], row[1]);
            }
        }
    }
}


Автор: Чердак 21.10.2008, 14:03
Может я конечно не так понял пример, но обновление там идет по строке, а не по всему DataSet. 
Я понимаю так, при редактировании DataSet (допустим всех строк), Adapter.Update -  должен икать введенные изменения и заносить их в базу. Как это сделать?
вот пример из помощи, но у меня ругается на это:

Код

try
{
    SqlDataAdapter1.Update(Dataset1.Tables["Table1"]);
}
catch (Exception e)
{
    // Error during Update, add code to locate error, reconcile 
    // and try to update again.
}



у меня ведь не добавление новой записи или удаление, а редактирование уже существующих. Как это обновляется в базе?

Автор: Partizan 21.10.2008, 15:57
Чердак, Чему равно значение свойства UpdateCommand у вашего SqlDataAdapter?

Автор: Чердак 21.10.2008, 19:26
UpdateCommand - автоматически, потому что использую:

Код

 SqlCommandBuilder bld = new SqlCommandBuilder(da); 


Добавлено через 4 минуты и 30 секунд
Вот если писать так, то ни на что не ругается, но и в базе обновления не появляются

Код

private string SelectString = @"
            SELECT  *
            FROM    ContractorBasic";

//---------------------------------
SqlDataAdapter da1 = new SqlDataAdapter(SelectString, ConnectionToSql);
            SqlCommandBuilder bld1 = new SqlCommandBuilder(da1);            
                da1.Fill(ds);
                ds.Tables[0].TableName = "NewDataSource";
                bs1.DataSource = ds;

                dataGridView1.DataSource = bs1;
                bs1.DataMember = "NewDataSource";
                bindingNavigator1.BindingSource = bs1;

//Вносим изменения в грид:

 Random fixRand = new Random();
           
            for (int i = 0; i < dataGridView1.RowCount; i++)
            {
                switch (fixRand.Next(3))
                {
                    case 1:
                        dataGridView1.Rows[i].Cells[9].Value = "Высокий";
                        break;
                    case 2:
                        dataGridView1.Rows[i].Cells[9].Value = "Средний";
                        break;

                    default:
                        dataGridView1.Rows[i].Cells[9].Value = "Низкий";
                        break;

                }    

//Сохраняем изменения:

            SqlDataAdapter da = new SqlDataAdapter(SelectString, ConnectionToSql);
            SqlCommandBuilder bld = new SqlCommandBuilder(da);
            DataSet dstemp = new DataSet();

                    da.Fill(dstemp);
                    dstemp.Tables[0].Clear();
                    ds.Tables[0].TableName = "NewDataSource";
                    dstemp.Merge(ds);
                    da.Update(dstemp);
                  


Автор: Чердак 22.10.2008, 01:18
Все работает, сори. Не задал ключ таблицы, поэтому и не изменялись данные.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)