powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не сразу обновляется поле в таблице Access
11 сообщений из 11, страница 1 из 1
Не сразу обновляется поле в таблице Access
    #32833998
narval
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть моих действий:
Две процедуры на vb.net, выполняются последовательно

Первая - выбирает из локальной базы Access новые записи из таблицы справочника и отправляет их на sql server, обратно получает ID которые получают записи на сервере и пишет эти ID (в качестве обновления поля этого справочника) в местную базу
Железно работает, многократно проверено.

Вторая - Выбирает записи из подчиненной таблицы местной базы Access с ID полученными в процедуре 1 и отправлет их на сервер.

Так вот, вторая процедура не видит полученые ID из предыдущего шага, отсылает упорно Null. Если между вызовами этих процедур поставить вызов закрытия коннекта к ACCESS и тут же его открытие - ОК, без вопросов, все нормально. Блокировок (по крайней мере насколько могу судить не очень разбираясь в jet) не возникает. Не хочу грузить приведением большого количества кода, тем не менее прошу поделиться тех кто имел такую проблему
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32837848
OstapBender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nedostatochno informazii. Hotelos' bi kusok koda, togda otvet bil bi bolee tochnim.Esli dopustit' chto ispol'zuyutsya transaction to po umolchaniyu ADO ispol'zuet "ReadComitted" level. Eto znachit chto "data zapisannaya odnoi transakziei budet dostupna posleduyuschei tol'ko posle togo kak pervaya budet zakonchena (commit)". Zitata iz knigi. Mozet v etom problema?
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32839473
Фотография Max Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Между вызовами надо воткнуть Doevents
Если одного оператора мало, то подряд парочку.
А вообще-то положено коннект закрывать-открывать.
Max Pro
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32841420
narval
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Max Pro - Doevents не помогает...
OstapBender маленьким куском кода не отделаться, хорошо, если не лень посмотри:

На сервере:
Код: 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.
CREATE TABLE ParentTable (IdSteady uniqueidentifier null, ParentText varchar( 255 ))
GO
CREATE TABLE ChildTable (IdSteady uniqueidentifier null default newid(),
	ParentId uniqueidentifier null ,
	ChildText varchar( 255 ))
GO
CREATE Proc InsertInParentTable
(@ParentText varchar( 255 ))
as
Set nocount on

declare @NewId uniqueidentifier

select @NewId = newid()

insert into dbo.ParentTable
(IdSteady, ParentText)
values
(@NewId, @ParentText)

select @NewId
GO
CREATE Proc InsertInChildTable
(@ParentId uniqueidentifier, @ChildText varchar( 255 ))
as
Set nocount on

insert into dbo.ChildTable
(ParentId, ChildText)
values
(@ParentId, @ChildText)
GO

В MDB файле:
Код: 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.
две таблицы:
ParentTable
Поля:
   IdRow - Счетчик
   IdSteady - Числовой (Код репликации)
   ParentText - Текстовый( 255 )

ChildTable
Поля:
   IdRow - Счетчик
   IdParent - Числовой (Код репликации)
   ChildText - Текстовый( 255 )

Три сохраненных запроса:

SelectFromLocalParentTable:
SELECT ParentTable.ParentText, ParentTable.IdRow
FROM ParentTable;

SelectFromLocalChildTable:
SELECT ParentTable.IdSteady, ChildTable.ChildText
FROM ParentTable INNER JOIN ChildTable ON ParentTable.IdRow = ChildTable.IdParent;

Update_IdSteady:
UPDATE ParentTable SET ParentTable.IdSteady = [A]
WHERE (((ParentTable.IdRow)=));


VB код:
Код: 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.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
Private SQLCnn As New SqlClient.SqlConnection
    Private AccessCnn As New OleDb.OleDbConnection
    Private AccessCnn1 As New OleDb.OleDbConnection
    Private SQLCmm As New SqlClient.SqlCommand
    Private AccessCmm As New OleDb.OleDbCommand
    Private AccessCmm1 As New OleDb.OleDbCommand

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        CnnAndCmmProperty()

        SQLCnn.Open()
        AccessCnn.Open()
        AccessCnn1.Open()

        TransferParentData()
        TransferChildData()

        AccessCnn1.Close()
        AccessCnn.Close()
        SQLCnn.Close()

    End Sub


    Private Sub CnnAndCmmProperty()
        SQLCnn.ConnectionString = ...
        AccessCnn.ConnectionString = ... Provider="Microsoft.Jet.OLEDB.4.0" ... 
        AccessCnn1.ConnectionString =  ... Provider="Microsoft.Jet.OLEDB.4.0" ... 
        
        SQLCmm.Connection = SQLCnn
        SQLCmm.CommandType = CommandType.StoredProcedure

        AccessCmm.Connection = AccessCnn
        AccessCmm.CommandType = CommandType.StoredProcedure

        AccessCmm1.Connection = AccessCnn1
        AccessCmm1.CommandType = CommandType.StoredProcedure

    End Sub

    Private Sub TransferChildData()
        SQLCmm.Parameters.Clear()

        SQLCmm.CommandText = "InsertInChildTable"
        SQLCmm.Parameters.Add("@ParentId", System.Data.SqlDbType.UniqueIdentifier)
        SQLCmm.Parameters.Add("@ChildText", System.Data.SqlDbType.VarChar,  [b]255 )

        AccessCmm.CommandText = "SelectFromLocalChildTable"

        Dim AccessReader As OleDb.OleDbDataReader = AccessCmm.ExecuteReader
        While AccessReader.Read()
            SQLCmm.Parameters( 0 ).Value = AccessReader( 0 )
            SQLCmm.Parameters( 1 ).Value = AccessReader( 1 )
            SQLCmm.ExecuteNonQuery()
        End While
        AccessReader.Close()

    End Sub
    Private Sub TransferParentData()

        SQLCmm.CommandText = "InsertInParentTable"
        SQLCmm.Parameters.Add("@ParentText", System.Data.SqlDbType.VarChar,  255 )

        AccessCmm.CommandText = "SelectFromLocalParentTable"

        AccessCmm1.CommandText = "Update_IdSteady"
        AccessCmm1.Parameters.Add(New OleDb.OleDbParameter)
        AccessCmm1.Parameters.Add(New OleDb.OleDbParameter)

        Dim AccessReader As OleDb.OleDbDataReader = AccessCmm.ExecuteReader
        While AccessReader.Read()
            SQLCmm.Parameters( 0 ).Value = AccessReader( 0 )
            AccessCmm1.Parameters( 0 ).Value = SQLCmm.ExecuteScalar
            AccessCmm1.Parameters( 1 ).Value = AccessReader( 1 )
            AccessCmm1.ExecuteNonQuery()
        End While
        AccessReader.Close()

    End Sub


После срабатывания на сервере в таблице ChildTable в поле ParentId стоит везде Null
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32841920
narval
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, во второй таблице Access поле
IdParent - Числовой (длинное целое) разумеется, это внешний ключ
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32852144
Фотография Max Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боже, ну ты и накрутил кодов! По-моему проще можно. Тогда и глюка этого не будет и в помине. А так конечно - у тебя запросы-то параллельно выполняются.
Вот как бы я сделал:

1. В Аксесе подключил бы нужные таблицы из SQL-сервера как связанные. Это дало бы сразу преимущество, что коннекшинов вместо трёх всего один будет.
2. Сделал бы запросик уже через Аксес, получающий ID. И потом следом 2-й. А между ними не забыл бы вставить DoEvents().
3. Кроме того напоминаю, что закрывать коннекшн полезно после каждого запроса - это правило особенно действует в ASP.NET (если под Win пишешь, то необязательно, хотя и желательно.)

Ну вот и всё.
P.S. извини, что долго не был на связи
Max Pro
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32852147
Фотография Max Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если не в лом, скинь пожалуйста как выглядит полностью твой коннекшнстринг для sql-server. А то мне по работе это скоро понадобится.
Max Pro
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32852928
narval
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кодов по минимуму :-) Проще уж некуда, в реале это самопальная репликация Access <> SQL sever. Параллельность выполенения этим и вызвана, что это меняет принципиально? Насчет закрытия/открытия соеденения согласен, практика показывает что так только и работает, хотелось бы только знать - почему?

ПС: Примерную строку для соеденения с SQLserver проще всего получить поместив на форму SQL connection, и воспользоваться мастером для ConnectionString
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32853059
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такое правило: "Коммитить" транзакцию.
До ее завершения внесенным данным "не верить".
Закрытие соединения собственно и служит этим "коммитом".

С Новым годом!
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32853922
narval
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, точно! Спасибо Воробьёфф. Кстати оказалось что подтверждение транзакции в Акцессе не только закрытие коннешна
...
Рейтинг: 0 / 0
Не сразу обновляется поле в таблице Access
    #32903114
Kulibin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати если используются несколько конекшенов, то данные которые изменяет один конекшн не сразу попадают в другой а с задержкой.
наверное это кэширование.
выход используй один конекшн
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Не сразу обновляется поле в таблице Access
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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