ADO.NET + MS Access 2002

Yura Mironchuk
Дата: 18.02.2005 17:16:47
Здраствуйте.
Есть у меня БД на аксессе.
Надо написать вебапп для работы с ней.

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

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

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

Поэтому когда делаю апдейт - получаеться в дочернюю таблицу, в ключевое поле пишуться 0


			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;
				}
			}	


как мне добавить значение в первую таблицу, чтобы и во второй были корректные данные
кузя
Дата: 18.02.2005 23:02:49
посмотри статью в MSDN
Retrieving Identity or Autonumber Values
Yura Mironchuk
Дата: 21.02.2005 16:03:28
Пробовал SELECT @@IDENTITY не работает в моем Access
по непонятным причинам.
остановился на

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

и стало мне счастье.
Alexey Kudinov
Дата: 21.02.2005 16:26:43
Yura Mironchuk
остановился на

...

и стало мне счастье.
Не надо так делать. Т.к. есть вероятность, что вы получите ID не своей добавленой строки. И эта вероятность будет расти с увеличением числа пользователей вашего приложения, либо других приложений, работающих с таблицей [Opportunity Table]
Sa
Дата: 21.02.2005 16:32:43
Надо подписываться на RowUpdated вашего DataAdapter'а, а там уже на Insert запрашивать SELECT @@IDENTITY, например через ExecuteScalar().

uid = Sa
Sa
Дата: 21.02.2005 16:36:26

Пробовал SELECT @@IDENTITY не работает в моем Access
по непонятным причинам.

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

uid = Sa
кузя
Дата: 21.02.2005 16:54:00
реально @@IDENTITY работают только в Jet 4.0 базах (Jet OLEDB:Engine Type должно быть равно 5 [это базы, созданные в Access 2000 и выше]).

для баз старого формата
Engine Type = 3 (Access 2)
Engine Type = 4 (Access 97)
@@IDENTITY не работает
Sa
Дата: 21.02.2005 16:57:25
Надо смотреть код, который вы мучили. Но и вариант через RowUpdated должен работать, в принципе ИМХО это единственный вариант при использовании MS Access.

uid = Sa
кузя
Дата: 21.02.2005 16:58:42
пропустил заголовок топика :)

MS Access 2002

работать должно, но теперь, возможно, автор топика (дабы объяснить ситуацию) объявится не скоро...
Sa
Дата: 21.02.2005 17:01:13
OFF:
Кузя

работать должно, но теперь, возможно, автор топика (дабы объяснить ситуацию) объявится не скоро...

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

uid = Sa