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

Просьба не пинать, т.к. с ADO.NET разбираюсь всего с недельку. Буду очень благодарен за образец кода.
...
Рейтинг: 0 / 0
17.07.2008, 08:34
    #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
17.07.2008, 22:22
    #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
17.07.2008, 22:32
    #35437975
bob_j
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить ТБД
2 WYPMAH, за ссылку спасибо, но там решение для сиквел сервера, а в моем случае к сожалению акцес.

Небольшой оффтоп.
Не въеду, в чем польза от ADO.NET, а именно работа с отключенным соединением? Нафига городить в памяти клиента дубликат БД (это же ненужная нагрузка на клиент - вырастут требования к его вычислительным мощностям), если всю необходимую бизнес-логику можно отдать серверу, а клиенту отдавать готовый результат, тут будет и экономия трафика и низкие требования к клиенту.
...
Рейтинг: 0 / 0
18.07.2008, 09:48
    #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
22.07.2008, 10:56
    #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
22.07.2008, 11:09
    #35444047
bob_j
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнить ТБД
Небольшая опечатка, в оригинальном коде не builder.GetInsertCommand(). ToString() , а builder.GetInsertCommand().
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Заполнить ТБД / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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