powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Dataset & DataAdapter
32 сообщений из 32, показаны все 2 страниц
Dataset & DataAdapter
    #35346149
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уважаемые конферяне, пытаюсь перейти с адо на адо.нет. позвольте мне один только вопрос. могу ли я принципиально загрузить в датасет данные датаадаптером из источника А (напимер, аксесса) и потом датаадаптером из датасета их перенести в получатель Б (например, на сервер)?
то есть по сути реализовать дата флоу таск?
читал про такие методы датаадаптера как
апдейд, инсерт/делит/комманд, но пока не понял, как вытащить данные из датасета...
если у вас вдруг есть пример кода, совсем будет замечательно )))
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35346214
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можешь.
правда,ты еще не понял что такое датасет :)
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35346236
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiKможешь.
правда,ты еще не понял что такое датасет :)

пасиб! что могу - главное. буду потихоньку разбираться.
а кусочка кода для примера нету?
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366042
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уважаемые, обзавелся книжкой некоего Дэвида Сеппы по адо.нет. для примера пытаюсь из одной аксессовской базы в другую просто перенести данные из таблички в табличку. не важно, что это можно сделать средствами самого аксесса ))). создал две базы и в каждой создал по табличке ABC (Letter varchar(1), Code integer) - в табличку в первой базе внес три записи. Соотвественно, A - 65, B - 66, C- 67. Табличка во второй базе пустая.
Приведенным ниже скриптом пытаюсь перенести данные. Машина код выполняет, но ничего не делает и в месседжбоксе affected rows = 0. Подскажите, в чем моя ошибка?
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366064
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дэвид Сеппа ниче там не пишет про CommandBuilder случаем?
Заюзайте его в вашем примере.
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366109
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_Lamer ,

посмотрел. команд билдер ведь генерит запрос? запрос-то я и сам могу написать, только вот непонятно, как его потом передать методу апдейт датасета.

понимаю, что прошу многого, но если несложно, можно хоть пару строк кода для примера?
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366125
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот на си шарпе пример(адаптировать к VB не проблема, думаю)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        protected DataTable GetDataTable(SqlCommand cmd, String connectionString)
        {
            SqlConnection con = new SqlConnection(connectionString);
            cmd.Connection = con;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            SqlCommandBuilder db = new SqlCommandBuilder(da);
            DataTable dt = new DataTable();

            try
            {
                da.Fill(dt);

                return dt;
            }
            finally { if (con.State == ConnectionState.Open) con.Close(); }
        }
Вместо префикса Sql... само - собой OleDb..., остальное все так - же
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366138
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
м-м-м... так ведь эта функция возвращает заполненный дататэйбл!
это и у мну получается безо всяких командбилдеров - возможно самонадеянно, но считаю себя в вопросах sql довольно крутым парнем ))) - я вот не понимаю, почему метод апдейт у мну отрабатывает впустую. тэйблмэппинг сделать? а зачем? датаадаптер смотрит только на одну таблицу. в параметры метода передается тоже только одна. и даже пробовал добавить строку с тэйблмэппингом - результат тот же, то есть нулевой.

мне б вот пример метода апдейт датасета, если можно...

я могу решить задачу путем перебора записей дататэйбла, формирования текстового sql запроса и передачи его на выполнение объекту команд - но это на большом числе записей варварство - работать будет вечность...
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366142
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ща напишу...
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366185
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот пример работы с дата адаптером и апдейт

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        public static void TestDb()
        {
            string constr = @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = c:\db1.mdb";
            DataTable dt = new DataTable();
            OleDbDataAdapter da = new OleDbDataAdapter("select * from tblTest", constr);
            
            OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
            da.Fill(dt);
            dt.Rows[ 0 ][ 1 ] = "Vasya";
            da.Update(dt);
            
        }
ваш пример неграмотный, что это за строка запроса при создании второго адаптера?
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366240
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему я понял, чего вы хотите - одним адаптером загрузить таблу, а другим воткнуть в другую базу?
боюсь вас огорчить...
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366243
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пожалуй, я готов согласиться, что запрос при декларации второго адаптера - безобразие. подумал, что по аналогии с адо.рекордсетом, где при открытии можно было просто указать имя таблицы, пройдет. поправил. добавил командбилдер - но не понимаю, он же не выполняет никакого метода - достаточно декларации? в примере у меня в месседжбоксах поля и значения хорошо отображаются, но вот аффектид роуз = 0. у меня принципиальное непонимание модели адо.нет?

Код: 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.
Public Sub Main()

        Dim i As Integer

        Dim da1 As New OleDb.OleDbDataAdapter("SELECT * FROM ABC", ConnStr(db1))
        Dim da2 As New OleDb.OleDbDataAdapter("SELECT * FROM ABC", ConnStr(db2))
        
Dim dt As New Data.DataTable("ABC")

        da1.Fill(dt)
        For i =  0  To dt.Columns.Count -  1 
            MsgBox(dt.Columns(i).ColumnName.ToString)
        Next
        For i =  0  To dt.Rows.Count -  1 
            MsgBox(dt.Rows(i).Item( 0 ).ToString)
        Next

        Dim cb As New OleDb.OleDbCommandBuilder(da2)
        MsgBox(da2.Update(dt).ToString)

        da1.Dispose()
        da2.Dispose()
        dt.Dispose()

        Dts.TaskResult = Dts.Results.Success
    End Sub

...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366245
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да. именно так, реализовать по сути дата флоу таск!
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366253
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но ведь это должно быть можно сделать! так как по сути дата сет - отсоединенные данные. никак не связанные с источником - и откуда пришел апдейт, из считанного из той же таблицы или откуда-то из другой базы - ведь должно быть неважно. разве нет?
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366262
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому - что при всей одинаковости первого и второго дата тэйблов, это все равно разные дататэйблы
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366288
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если в данном случае я:
-- считаю в 2 дататэйбла данные двумя адаптерами из двух баз,
-- помещу оба дататэйбла в датасет,

могу ли в датасете произвести вставку из одной таблицы в другую и потом уже апдейтить?

или проще попытаться "объяснить" второму адаптеру, что таблица все-таки такая же?
каким образом? ну хоть общее направлене, не детально.
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366341
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему никак вы не объясните адаптеру, что это та - же таблица :)
вставку вы в цикле тока по моему можете сделать из одного дата тэйбла в другой
что - нибудь вроде этого псевдокода:
Код: plaintext
1.
2.
3.
4.
5.
6.
For Each row In DataTable1.Rows
    Dim row1 as DataRow
    row1 = DataTable1.NewRow
    row1("name") = row("name")
    DataTable1.Rows.Add(row1)
Next
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366345
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в смысле
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
For Each row In DataTable.Rows
    Dim row1 as DataRow
    row1 = DataTable1.NewRow
    row1("name") = row("name")
    DataTable1.Rows.Add(row1)
Next


...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366371
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noisette
что вы за сложности изобретаете? зачем вам датаТейблы если вы просто хотите перенести данные?

алгоритм ваших действий таков:

Код: plaintext
1.
2.
3.
4.
5.
- создали коннекшн;
- открыли транзакцию;
- выполнили выборку (комманд вам в помощь);
- прочитали выборку в цикле (ридер поможет);
- в цикле выполнили параметризированный инсерт (тот же комманд это умеет);
- закрыли транзакцию.

ВСЁ!
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366381
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WYPMAH noisette
что вы за сложности изобретаете? зачем вам датаТейблы если вы просто хотите перенести данные?

алгоритм ваших действий таков:

Код: plaintext
1.
2.
3.
4.
5.
- создали коннекшн;
- открыли транзакцию;
- выполнили выборку (комманд вам в помощь);
- прочитали выборку в цикле (ридер поможет);
- в цикле выполнили параметризированный инсерт (тот же комманд это умеет);
- закрыли транзакцию.

ВСЁ!

просто человек думал, можно дата тэйблы подменить и с циклами не париться ;)
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366395
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
несомненно.
но есть сильное подозрение, что, положим, хотя бы жалкий миллион записей в цикле будет перебираться ну очень долго. нет?

пока пободаюсь еще с колумнмэппингом. не может такого быть, чтобы разработчики идею апдейта вида

update
from
inner join

заменили на циклический апдейт записей.
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366419
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noisetteнесомненно.
но есть сильное подозрение, что, положим, хотя бы жалкий миллион записей в цикле будет перебираться ну очень долго. нет?

пока пободаюсь еще с колумнмэппингом. не может такого быть, чтобы разработчики идею апдейта вида

update
from
inner join

заменили на циклический апдейт записей.

Вы как делаете инсерт в T - SQL?
вы же пишете, что крутой парень в SQL
а ежели так, то знаете, что больше одного инсерта за раз сделать нельзя
Возможно есть технологии, которые инкапсулируют цикл,
однако цикл в любом случае присутствует
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366442
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну не стоит придираться так к словам )))
я понимаю, что машина все равно перебирает записи, а имел в виду, что если мы вместо уже упоминавшейся конструкции

update
from
inner join

будем использовать

declare cursor for select
while
update ...
where ...

то время исполнения возрастает до безобразия. курсоры и циклы в явном виде - зло )))
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366480
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, подводя итог:
в вашем случае я бы делал, как WYPMAH
если бы это был Sql Server, а не Access, то вообще делал бы это на сервере(в аксесе не знаю, нету наверное такой возможности)
Хочу вам еще книжку посоветовать на прощание - Боб Бошемин - Основы ADO.NET :)
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366489
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
благодарю, записал.
а латиницей его как?
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35366493
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А фиг его знает - он в русском переводе имеется
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35367357
Фотография Sweet_Alkazar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noisetteуважаемые конферяне, пытаюсь перейти с адо на адо.нет. позвольте мне один только вопрос. могу ли я принципиально загрузить в датасет данные датаадаптером из источника А (напимер, аксесса) и потом датаадаптером из датасета их перенести в получатель Б (например, на сервер)?
то есть по сути реализовать дата флоу таск?
читал про такие методы датаадаптера как
апдейд, инсерт/делит/комманд, но пока не понял, как вытащить данные из датасета...
если у вас вдруг есть пример кода, совсем будет замечательно )))

Можете,
например так(FW 1.0)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            
            da1 = New SqlDataAdapter("SELECT * FROM Messages", CONNECTION_STRING_1)
            da1.Fill(ds_src)

            da2 = New SqlDataAdapter("SELECT * FROM Messages", CONNECTION_STRING_2)
            cb = New SqlCommandBuilder(da2)
            da2.FillSchema(ds_dest, SchemaType.Source)

            For Each row In ds_src.Tables( 0 ).Rows
                ds_dest.Tables( 0 ).LoadDataRow(row.ItemArray, False)
            Next

            da2.Update(ds_dest)
ds_dest.Tables(0).LoadDataRow(row.ItemArray, False) приходится делать, чтобы DataRowState нового
DataRow в ds_dest стало Added и таким образом DataAdapter выполнил бы для этого рау команду вставки.

WYPMAHчто вы за сложности изобретаете? зачем вам датаТейблы если вы просто хотите перенести данные?

алгоритм ваших действий таков:


- создали коннекшн;
- открыли транзакцию;
- выполнили выборку (комманд вам в помощь);
- прочитали выборку в цикле (ридер поможет);
- в цикле выполнили параметризированный инсерт (тот же комманд это умеет);
- закрыли транзакцию.

ВСЁ!
Если у нас два источника данных, то ИМХО такая схема не пройдет. Для каждого источника свой коннектшн, а объект транзактшн ассоциирован с конкретным коннекшном.
---
По-видимому(сам никогда не занимался), перенос данных совсем не простая штука, не зря же в
MS SQL 2005 этим занимается отдельный компонент - Integration Services
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35367395
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот уж транзакции на двух источниках не проблема:
у мну есть клиентский тул - аксесс, который хранит данные локально и коннектится на свервер - чтоб и там данные обновить
вот у мну и стоят в коде параллельные
mdb_cn.BeginTrans
sql_cn.BeginTrans

и коммиты. а если хоть в одном коннекшне возникает ошибка (адо, не адо.нет), то роллбэчу обе транзакции.

работает "на ура"
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35367402
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
изложенного в примере пока не осилил - буду разбираться. пасиб
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35367560
Фотография Sweet_Alkazar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noisetteвот уж транзакции на двух источниках не проблема:
у мну есть клиентский тул - аксесс, который хранит данные локально и коннектится на свервер - чтоб и там данные обновить
вот у мну и стоят в коде параллельные
mdb_cn.BeginTrans
sql_cn.BeginTrans

и коммиты. а если хоть в одном коннекшне возникает ошибка (адо, не адо.нет), то роллбэчу обе транзакции.

работает "на ура"
А можно поподробнее, не очень понял всё структуру, особенно как выполняется коммит обоих транзакций
Если написать, что-то вроде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Try
    trans_1.Commit
Catch ex As exception
    trans_2.Rollback
End Try
Try
    trans_2.Commit
Catch
End Try 
То если, например, первый коммит не удастся, то второй тож откатится,
Но если первый удастся, а второй нет, то первый уже не откатить. Т.е такая схема не подходит
А у вас как?)
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35367670
noisette
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вырезав незначащие куски кода, оставил только форму. напоминаю, что это адо для вба в офисе 2003. из таблицы я беру значения полей для каждой записи, пробегаю циклом и формирую запрос. у меня два адо коннекшна - на локальную базу и на сервер

Код: 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.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Private Sub StartCorrection_Click()
On Error GoTo Err_StartCorrection_Click:

    
    Dim mdb_cn As ADODB.Connection
    Dim sql_cn As ADODB.Connection
    

	...
    
	do	'перебираю записи из таблицы и обрабатываю каждую отдельно	'
                    ... ' готовлю запрос как строку'
                    sql_cn.BeginTrans
                    mdb_cn.BeginTrans
                    
                    On Error GoTo ERR_EXEC_SQL
			
		    sql_cn.execute (<некий скрипт>)
		    mdb_cn.execute (<некий скрипт>)		
  		
                    
                    sql_cn.CommitTrans
                    mdb_cn.CommitTrans

next_record:
	loop                    
  
    
Exit_StartCorrection_Click:
   On Error Resume Next
   ... ' закрываем коннекшны и рекордсеты'
   Exit Sub
    
Err_StartCorrection_Click:
    MsgBox Err.Description, vbCritical
    Err.Clear
    GoTo Exit_StartCorrection_Click

ERR_EXEC_SQL:
    On Error GoTo Err_StartCorrection_Click
    
    If mdb_cn.Errors.Count >  0  Or sql_cn.Errors.Count >  0  Then
    
        mdb_cn.RollbackTrans
        sql_cn.RollbackTrans
        
        
	...	'логирование ошибки    '    
        
        mdb_cn.Errors.Clear
        sql_cn.Errors.Clear
    
        
        
    End If
    Resume next_record
    
    
End Sub

в общем так вот
...
Рейтинг: 0 / 0
Dataset & DataAdapter
    #35367749
Фотография Sweet_Alkazar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, подход понял)
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Dataset & DataAdapter
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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