powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Заполнить ТБД
7 сообщений из 7, страница 1 из 1
Заполнить ТБД
    #35434773
bob_j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть две Access'овских базы данных с разными именами, но абсолютно идентичные внутри. Т.е. в каждой, к примеру, по две таблицы, с абсолютно идентичной структурой. Каким образом можно средствами ADO.NET передать из БД1.ТБД1 данные в БД2.ТБД2 ? Я окончательно запутался в понятиях и иерархии DataSet DataRow, DataTable и т.д.

Просьба не пинать, т.к. с ADO.NET разбираюсь всего с недельку. Буду очень благодарен за образец кода.
...
Рейтинг: 0 / 0
Заполнить ТБД
    #35435529
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bob_j
смотри, всё начинается от Connection'а, как только он создан, то дальнейшая работа с датаСетами/датаТейблами/коммандами происходит с помощью этого конекшна.
следовательно, вам необходимо создать 2 конекншна, один для одной базы, другой для другой, а затем уже переносите базу любым из известных вам способом, что Command'ом, что DataSet'ом/DataTable'ом ;)

ЗЫ также почитайте вот это (ссылка в МСДНе):
ms-help://MS.MSDNQTR.v90.en/wd_adonet/html/83a7a0d2-8018-4354-97b9-0b1d99f8342b.htm
...
Рейтинг: 0 / 0
Заполнить ТБД
    #35437969
bob_j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ниже образец моего кода. Когда выполнение доходит до строки daOneT.Update(dsOneT, "tblOne"); , я получаю сообщение: "Для обновления требуется действительный InsertCommand при передаче коллекции DataRow с новыми строками." , хотя во всех книгах пишут о том, что достаточно просто добавить новые объекты DataRow в Table и вызвать метод Update Adapter'а.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
{
            OleDbConnection connOne = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Projects\\Projects-ADO.NET\\DataBases\\db_one.mdb");
			connOne.Open();
            OleDbConnection connTwo = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Projects\\Projects-ADO.NET\\DataBases\\db_two.mdb");
            connTwo.Open();

            DataSet dsOne = new DataSet();
            
            DataSet dsOneT = new DataSet();
            
            OleDbDataAdapter daOne = new OleDbDataAdapter("SELECT * FROM tblOne", connOne);
            OleDbDataAdapter daTwo = new OleDbDataAdapter("SELECT * FROM tblTwo",connOne);

            OleDbDataAdapter daOneT = new OleDbDataAdapter("SELECT * FROM tblOne", connTwo);
            OleDbDataAdapter daTwoT = new OleDbDataAdapter("SELECT * FROM tblTwo", connTwo);
            
            daOne.Fill(dsOne, "tblOne");
            daTwo.Fill(dsOne, "tblTwo");

            daOneT.Fill(dsOneT, "tblOne");
            daTwoT.Fill(dsOneT, "tblTwo");

            object[] rwsOne = new object[dsOneT.Tables["tblOne"].Columns.Count];
            
            foreach (DataRow row in dsOne.Tables["tblOne"].Rows)
                {
                    int i =  0 ;
                    foreach (DataColumn column in dsOne.Tables["tblOne"].Columns)
                    {
                        rwsOne = row[column];                        
                        i++;
                    }                 
                        dsOneT.Tables["tblOne"].Rows.Add(rwsOne);                        
                }
            [i]daOneT.Update(dsOneT, "tblOne");                      
        }
...
Рейтинг: 0 / 0
Заполнить ТБД
    #35437975
bob_j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 WYPMAH, за ссылку спасибо, но там решение для сиквел сервера, а в моем случае к сожалению акцес.

Небольшой оффтоп.
Не въеду, в чем польза от ADO.NET, а именно работа с отключенным соединением? Нафига городить в памяти клиента дубликат БД (это же ненужная нагрузка на клиент - вырастут требования к его вычислительным мощностям), если всю необходимую бизнес-логику можно отдать серверу, а клиенту отдавать готовый результат, тут будет и экономия трафика и низкие требования к клиенту.
...
Рейтинг: 0 / 0
Заполнить ТБД
    #35438333
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bob_j
например, так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
using (OleDbConnection connectionSource = 
    new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Projects\\Projects-ADO.NET\\DataBases\\db_one.mdb"))
{
    connectionSource.Open();
    OleDbCommand commandSource = new OleDbCommand("SELECT * FROM tblOne", connectionSource);
    OleDbDataAdapter adapterSource = new OleDbDataAdapter(commandSource);
    DataTable tableSource = new DataTable();
    adapterSource.Fill(tableSource);

    using (OleDbConnection connectionDestination = 
        new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Projects\\Projects-ADO.NET\\DataBases\\db_two.mdb"))
    {
        connectionDestination.Open();
        OleDbCommand commandDestination = new OleDbCommand("SELECT * FROM tblOne", connectionDestination);
        OleDbDataAdapter adapterDestination = new OleDbDataAdapter(commandDestination);
        DataTable tableDestination = new DataTable();
        adapterDestination.Fill(tableDestination);

        foreach (DataRow r in tableSource.Rows)
        {
            r.SetAdded();
            tableDestination.ImportRow(r);
        }

        using (OleDbCommandBuilder builder = new OleDbCommandBuilder(adapterDestination))
        {
            builder.GetUpdateCommand();
            adapterDestination.Update(tableDestination);
            tableDestination.AcceptChanges();
        }
    }
}

ЗЫ да, и пользуйтесь using'ом для IDisposable объектов.
...
Рейтинг: 0 / 0
Заполнить ТБД
    #35444001
bob_j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый затык, теперь с транзакцией
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
String[] tblsTitle = new String[] { "tblOne", "tblTwo" };
            foreach (String tbl in tblsTitle)
            {
                OleDbConnection connOne = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Projects\\Projects-ADO.NET\\DataBases\\db_one.mdb");
                connOne.Open();
                OleDbConnection connTwo = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Projects\\Projects-ADO.NET\\DataBases\\db_two.mdb");
                connTwo.Open();                

                DataSet dsOne = new DataSet();
                DataSet dsOneT = new DataSet();
               
                OleDbDataAdapter daOne = new OleDbDataAdapter("SELECT * FROM " + tbl, connOne);               
                daOne.Fill(dsOne, tbl);

                OleDbDataAdapter daOneT = new OleDbDataAdapter("SELECT * FROM " + tbl, connTwo);
                daOneT.Fill(dsOneT, tbl);


                using(OleDbTransaction txn = connTwo.BeginTransaction())
                {
                    //Здесь должна быть конструкция try except
                    OleDbCommand cmd = new OleDbCommand("DELETE FROM " + tbl, connTwo, txn);
                    OleDbCommandBuilder builder = new OleDbCommandBuilder(daOneT);
                    
                    cmd.ExecuteNonQuery();                    
                    
                    object[] rwsOne = new object[dsOneT.Tables[tbl].Columns.Count];

                    foreach (DataRow row in dsOne.Tables[tbl].Rows)
                    {
                        int i =  0 ;
                        foreach (DataColumn column in dsOne.Tables[tbl].Columns)
                        {
                            rwsOne[i] = row[column];
                            i++;
                        }
                        dsOneT.Tables[tbl].Rows.Add(rwsOne);
                    }
                    
                        builder.GetInsertCommand().ToString();
                        daOneT.Update(dsOneT, tbl);
                        dsOneT.Tables[tbl].AcceptChanges();
                        txn.Commit();
                }
                connOne.Close();
                connTwo.Close();
            } 

Когда выполнение доходит до строки: builder.GetInsertCommand().ToString(); , то получаю сообщение: "ExecuteReader требует, чтобы команда имела транзакцию, если подключение, назначенное команде, находится в отложенной локальной транзакции Свойство Transaction для команды не инициализировано." . Подскажите, где я опять накосячил?
...
Рейтинг: 0 / 0
Заполнить ТБД
    #35444047
bob_j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшая опечатка, в оригинальном коде не builder.GetInsertCommand(). ToString() , а builder.GetInsertCommand().
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Заполнить ТБД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]