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

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

Есть 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
18.02.2005, 23:02
    #32924421
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET + MS Access 2002
посмотри статью в MSDN
Retrieving Identity or Autonumber Values
...
Рейтинг: 0 / 0
21.02.2005, 16:03
    #32926592
Yura Mironchuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET + MS Access 2002
Пробовал SELECT @@IDENTITY не работает в моем Access
по непонятным причинам.
остановился на

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

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

...

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

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

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

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

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

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

MS Access 2002

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

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

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
22.02.2005, 14:49
    #32928582
Yura Mironchuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET + MS Access 2002
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
22.02.2005, 14:58
    #32928612
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET + MS Access 2002
судя по всему надо так. Я не пробовал. И после этого в датасете должно появиться нужное значение в поле, соответствуещем счетчику?

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

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

да, но естественно привиденный вами код надо поправить, в частности:
Код: 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
22.02.2005, 16:23
    #32928820
Yura Mironchuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO.NET + MS Access 2002
Sa

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

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


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