powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO.NET + MS Access 2002
14 сообщений из 14, страница 1 из 1
ADO.NET + MS Access 2002
    #32923938
Yura Mironchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здраствуйте.
Есть у меня БД на аксессе.
Надо написать вебапп для работы с ней.

Суть проблемы:

Есть DataSet в котором 2 DataTable.
Определил DataRelation между ними.
Связь идеть по полю в Access типа Счетчик.

При редактировании полей мне известен индекс текущей записи в таблице.
А при добавленни новой - он пока неизвестен.

Поэтому когда делаю апдейт - получаеться в дочернюю таблицу, в ключевое поле пишуться 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.
28.
29.
30.
31.
32.
33.
34.
35.
			OleDbConnection oldbConn = new OleDbConnection(ConfigurationSettings.AppSettings["connectionString"]);						
			OleDbDataAdapter myDataAdapter = new OleDbDataAdapter();
			myDataAdapter.SelectCommand = new OleDbCommand("SELECT * FROM [Opportunity Table]", oldbConn);				
			OleDbCommandBuilder cbldr = new OleDbCommandBuilder(myDataAdapter);
			cbldr.QuotePrefix = "[";
			cbldr.QuoteSuffix = "]";
			OleDbDataAdapter myDataAdapter1 = new OleDbDataAdapter();
			myDataAdapter1.SelectCommand = new OleDbCommand("SELECT * FROM [Opportunity Task Table]", oldbConn);				
			OleDbCommandBuilder cbldr1 = new OleDbCommandBuilder(myDataAdapter1);
			cbldr1.QuotePrefix = "[";
			cbldr1.QuoteSuffix = "]";

			try
			{
				oldbConn.Open();
				if(pOppDs.Tables[ 0 ].Rows[ 0 ]["Opportunity Number"] is DBNull)
				{
				}
				else
				{
					int i = (int)pOppDs.Tables[ 0 ].Rows[ 0 ]["Opportunity Number"];
				}				
				myDataAdapter.Update(pOppDs, CONST_OPPORTUNITY_TABLE);	
				myDataAdapter1.Update(pOppDs, CONST_TASK_TABLE);

			}
			finally
			{				
				if (oldbConn != null)
				{
					oldbConn.Close();
					oldbConn = null;
				}
			}	


как мне добавить значение в первую таблицу, чтобы и во второй были корректные данные
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32924421
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотри статью в MSDN
Retrieving Identity or Autonumber Values
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32926592
Yura Mironchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал SELECT @@IDENTITY не работает в моем Access
по непонятным причинам.
остановился на

Код: plaintext
OleDbCommand cmdGetLastIndex = new OleDbCommand("SELECT TOP 1 [Opportunity Number] FROM [Opportunity Table] ORDER BY [Opportunity Number] DESC", oldbConn);

и стало мне счастье.
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32926667
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yura Mironchukостановился на

...

и стало мне счастье. Не надо так делать. Т.к. есть вероятность, что вы получите ID не своей добавленой строки. И эта вероятность будет расти с увеличением числа пользователей вашего приложения, либо других приложений, работающих с таблицей [Opportunity Table]
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32926681
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо подписываться на RowUpdated вашего DataAdapter'а, а там уже на Insert запрашивать SELECT @@IDENTITY, например через ExecuteScalar().

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32926698
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал SELECT @@IDENTITY не работает в моем Access
по непонятным причинам.

И почему не работает SELECT @@IDENTITY - каким образом вы его использовали?

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32926766
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реально @@IDENTITY работают только в Jet 4.0 базах (Jet OLEDB:Engine Type должно быть равно 5 [это базы, созданные в Access 2000 и выше]).

для баз старого формата
Engine Type = 3 (Access 2)
Engine Type = 4 (Access 97)
@@IDENTITY не работает
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32926777
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо смотреть код, который вы мучили. Но и вариант через RowUpdated должен работать, в принципе ИМХО это единственный вариант при использовании MS Access.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32926784
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пропустил заголовок топика :)

MS Access 2002

работать должно, но теперь, возможно, автор топика (дабы объяснить ситуацию) объявится не скоро...
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32926791
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OFF:
Кузя
работать должно, но теперь, возможно, автор топика (дабы объяснить ситуацию) объявится не скоро...

Не объявится - объясним и решим за него :-)

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32928582
Yura Mironchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Kuninov:

Знаю что так нельзя, но я на это угробил день. Это единственное что мне помогло. А перед этим еще и парился с QuotedPrefix и втихаря материл умника который пообзывал таблицы и поля с пробелами.

Кузя: статью смотрел, но после того как на выходных в екстренном темпе прикрутил SELECT TOP 1. После этого разбираться с ней не стал.

Sa: Я использовал таким образом: через апликуху добавил новую запись. А потом через запрос в аксесе SELECT @@IDENTITY. Тут я наверняка не прав.
А как правильно опять же не знаю и разбираться не стал.
Я так понял что это @@IDENTITY надо связать с моим адаптером.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
protected static void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args)
  {
    // Include a variable and a command to retrieve the identity value from the Access database.
    int newID =  0 ;
    OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", nwindConn);

    if (args.StatementType == StatementType.Insert)
    {
      // Retrieve the identity value and store it in the CategoryID column.
      newID = (int)idCMD.ExecuteScalar();
      args.Row["CategoryID"] = newID;
    }
  }


судя по всему надо так. Я не пробовал. И после этого в датасете должно появиться нужное значение в поле, соответствуещем счетчику?

P.S Огромное спасибо всем кто откликнулся и наговорил дельных вещей. Ато это было бы мое последнее разочарование в форумах :-(
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32928612
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
судя по всему надо так. Я не пробовал. И после этого в датасете должно появиться нужное значение в поле, соответствуещем счетчику?

Да!!! только не забываем подписаться на RowUpdated
Код: plaintext
1.
myDataAdapter.RowUpdated += new OleDbRowUpdatedEventHandler(OnRowUpdated);

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32928649
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужное значение в поле, соответствуещем счетчику?

да, но естественно привиденный вами код надо поправить, в частности:
Код: plaintext
1.
2.
3.
4.
....
OleDbCommand idCMD = new OleDbCommand("SELECT @@IDENTITY", da.SelectCommand.Connection); // где da - ваш DataAdapter, например можно объявить его private в модуле в крайнем случае возьмем Sender
....
args.Row["Opportunity Number"] = newID;
Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ADO.NET + MS Access 2002
    #32928820
Yura Mironchuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sa

Спасибо за комменты, но последний уже был лишним :-)
То я просто взял код со статьи и естественно в моем случае будут мои параметры :-)

Общий вывод: всеже както будет свободное время - переделаю с onRowUpdated
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO.NET + MS Access 2002
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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