Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 31.10.04 07:46
Оценка:
Всем привет! Подскажите пожалуйста как разрешить следующую проблему.
Есть у меня база данных аля MS Access. Пишу ASP.NET'ую морду для доступа к этой базе. Читаю из неё без проблем, а вот удалить запись, обновить или вставить нговую не удается. Получаю exeption следующего содержания:
— при попытке удаления записи: "Невозможно удаление записей из указанных таблиц."
— при попытке обновить запись или вставить новую: "В операции должен использоваться обновляемый запрос."
Что бы это могло значить и в чем может быть проблема?
Использую ADO.NET'ый механизм:
// connection string
protected string _sConnection = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\olContacts.mdb";

Например, обновляю запись так:

private void btnUpdate_Click(object sender, System.EventArgs e)
{
string sUpdateSQL = "UPDATE Users SET ";
sUpdateSQL += "GroupID='" + txtGroupID.Text + "',";
sUpdateSQL += "NickName='" + txtNickName.Text + "',";
sUpdateSQL += "UserOrder='" + txtOrder.Text + "',";
sUpdateSQL += "ItemData='" + txtItemData.Text + "' ";
sUpdateSQL += " WHERE ItemData=" + lstUsers.SelectedItem.Value;
// ADO.NET objects
OleDbConnection oleConnection = new OleDbConnection(_sConnection);
OleDbCommand oleCommand = new OleDbCommand(sUpdateSQL,oleConnection);
int nUpdated = 0;
try
{
oleConnection.Open();
nUpdated = oleCommand.ExecuteNonQuery();
lblInfo.Text = nUpdated.ToString() + " records updated.";
}
catch(Exception err)
{
lblInfo.ForeColor = Color.Purple;
lblInfo.Text = "Error updating record. ";
lblInfo.Text = err.Message;
}
finally
{
if( oleConnection != null )
{
oleConnection.Close();
}
}
}

А удаляю например так:

private void btnDelete_Click(object sender, System.EventArgs e)
{
string sDeleteSQL = "DELETE FROM Users ";
sDeleteSQL += "WHERE ItemData=" + lstUsers.SelectedItem.Value;
// ADO.NET objects
OleDbConnection oleConnection = new OleDbConnection(_sConnection);
OleDbCommand oleCommand = new OleDbCommand(sDeleteSQL,oleConnection);
int nDelItems = 0;
try
{
oleConnection.Open();
nDelItems = oleCommand.ExecuteNonQuery();
lblInfo.Text = nDelItems.ToString() + " records deleted.";
}
catch(Exception err)
{
lblInfo.ForeColor = Color.Purple;
lblInfo.Text = "Error deliting record. ";
lblInfo.Text = err.Message;
}
finally
{
if( oleConnection != null )
{
oleConnection.Close();
}
}
if( nDelItems > 0 )
{
FillUsersList();
}
}

Что тут неверно?

Спасибо всем неравнодушным!
Re: Добавление записей в БД Access с помощью ADO.NET
От: vvvoloshin1 Канада  
Дата: 31.10.04 12:03
Оценка:
какой SQL запрос-то получается ? прислал бы
Re[2]: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 31.10.04 12:23
Оценка:
Здравствуйте, vvvoloshin1, Вы писали:

V>какой SQL запрос-то получается ? прислал бы


Я в деле ASP.NET + ADO.NET новичок, поэтому честно говоря не очень понимаю твоего вопроса. Что нужно прислать? Как выглядит строчка сиквела или что?
Re[3]: Добавление записей в БД Access с помощью ADO.NET
От: vvvoloshin1 Канада  
Дата: 31.10.04 12:36
Оценка:
Здравствуйте, dmaster1, Вы писали:

D>Здравствуйте, vvvoloshin1, Вы писали:


V>>какой SQL запрос-то получается ? прислал бы


D>Я в деле ASP.NET + ADO.NET новичок, поэтому честно говоря не очень понимаю твоего вопроса. Что нужно прислать? Как выглядит строчка сиквела или что?


ну конечно, а говорит не понимает...
Re[4]: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 31.10.04 17:59
Оценка:
Здравствуйте, vvvoloshin1, Вы писали:

V>Здравствуйте, dmaster1, Вы писали:


D>>Здравствуйте, vvvoloshin1, Вы писали:


V>>>какой SQL запрос-то получается ? прислал бы


D>>Я в деле ASP.NET + ADO.NET новичок, поэтому честно говоря не очень понимаю твоего вопроса. Что нужно прислать? Как выглядит строчка сиквела или что?


V>ну конечно, а говорит не понимает...


При обновлении сиквел получается такой:

UPDATE Users SET GroupID='1',NickName='Дядя Ваня',UserOrder='2',ItemData='3' WHERE ItemData=3

при этом имею "противный" эксепшен: В операции должен использоваться обновляемый запрос.

А при попытки удалить строчку сиквел такой:

DELETE FROM Users WHERE ItemData=6

а эксепшен такой: Невозможно удаление записей из указанных таблиц.

Где собака зарыта???
Re[5]: Добавление записей в БД Access с помощью ADO.NET
От: vvvoloshin1 Канада  
Дата: 31.10.04 18:38
Оценка:
В случае DELETE может у тебя ссылки на эти записи из других таблиц, проверь Primary/Foreign Keys
Над Update размышляем.... но может та же причина
Re[4]: Добавление записей в БД Access с помощью ADO.NET
От: Аноним  
Дата: 31.10.04 19:03
Оценка:
Подобные проблемы обычно разрешаются так: получаешь SQL-запрос, который у тебя идет к базе, открываешь эту базу в Access, делаешь новый запрос, переходишь к SQL-представлению, вставляешь строчку своего запроса, запускаешь — Access показывает конкретное место которое ему не нравится.
Еще совет — все названия таблиц и полей в запросе помещай в квадратные скобки. В Jet есть оочень много "запрещенных" слов, которые нельзя использовать напрямую. В данном случае слово Users выглядит очень подозрительно. Я бы написал [Users].


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[6]: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 31.10.04 19:40
Оценка:
Здравствуйте, vvvoloshin1, Вы писали:

V>В случае DELETE может у тебя ссылки на эти записи из других таблиц, проверь Primary/Foreign Keys

V>Над Update размышляем.... но может та же причина

Нее. Исключено. Правда у меня в базе две таблицы (Users и Groups) но они не связаны.
Re[5]: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 31.10.04 19:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подобные проблемы обычно разрешаются так: получаешь SQL-запрос, который у тебя идет к базе, открываешь эту базу в Access, делаешь новый запрос, переходишь к SQL-представлению, вставляешь строчку своего запроса, запускаешь — Access показывает конкретное место которое ему не нравится.

А>Еще совет — все названия таблиц и полей в запросе помещай в квадратные скобки. В Jet есть оочень много "запрещенных" слов, которые нельзя использовать напрямую. В данном случае слово Users выглядит очень подозрительно. Я бы написал [Users].

А>
данное сообщение получено с www.gotdotnet.ru

А>ссылка на оригинальное сообщение


Красивая идея. Щас попробую...
Re[5]: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 31.10.04 20:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подобные проблемы обычно разрешаются так: получаешь SQL-запрос, который у тебя идет к базе, открываешь эту базу в Access, делаешь новый запрос, переходишь к SQL-представлению, вставляешь строчку своего запроса, запускаешь — Access показывает конкретное место которое ему не нравится.

А>Еще совет — все названия таблиц и полей в запросе помещай в квадратные скобки. В Jet есть оочень много "запрещенных" слов, которые нельзя использовать напрямую. В данном случае слово Users выглядит очень подозрительно. Я бы написал [Users].

А>
данное сообщение получено с www.gotdotnet.ru

А>ссылка на оригинальное сообщение


Проверил. Расстановка квадратных скобок скобок не прокатывает. Зато этот сиквел на UPDATE в этой базе, открытой в ACCESS'е сработал на ура: строка обновилась, и ACCESS ни к чему ни придрался, только сто раз спрашивал, точно ли я уверен, что хочу обновить эту строчку, и знаю ли я, что "назад дороги не будет"
Из под ASP.NET проблема осталась...
Re[6]: Добавление записей в БД Access с помощью ADO.NET
От: vvvoloshin1 Канада  
Дата: 31.10.04 21:02
Оценка:
А Delete в базе сработал ?
Re[5]: Добавление записей в БД Access с помощью ADO.NET
От: Леон Казахстан  
Дата: 01.11.04 05:44
Оценка:
Здравствуйте, dmaster1, Вы писали:

D>UPDATE Users SET GroupID='1',NickName='Дядя Ваня',UserOrder='2',ItemData='3' WHERE ItemData=3

Ты используешь
ItemData='3' и ItemData=3
Непонял это что? Опечатка или косяк?
... << RSDN@Home 1.1.4 @@subversion >>
Re[6]: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 01.11.04 07:02
Оценка:
Здравствуйте, Леон, Вы писали:

Л>Здравствуйте, dmaster1, Вы писали:


D>>UPDATE Users SET GroupID='1',NickName='Дядя Ваня',UserOrder='2',ItemData='3' WHERE ItemData=3

Л>Ты используешь
Л>ItemData='3' и ItemData=3
Л>Непонял это что? Опечатка или косяк?

Да я честно говоря и сам думал, что это такое, когда сначала написал ItemData='3' и получил эксепшен, что мол неверное выражение в условии запроса. Пришлось убрать апострофы...
Re[6]: Добавление записей в БД Access с помощью ADO.NET
От: Аноним  
Дата: 01.11.04 09:30
Оценка:
Ну ты с типом данных то определись!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Добавление записей в БД Access с помощью ADO.NET
От: just_dmitry Россия www.parsec-club.ru
Дата: 01.11.04 09:54
Оценка:
Здравствуйте, dmaster1, Вы писали:

D>Всем привет! Подскажите пожалуйста как разрешить следующую проблему.

D>Есть у меня база данных аля MS Access. Пишу ASP.NET'ую морду для доступа к этой базе. Читаю из неё без проблем, а вот удалить запись, обновить или вставить нговую не удается. Получаю exeption следующего содержания:
D> — при попытке удаления записи: "Невозможно удаление записей из указанных таблиц."
D> — при попытке обновить запись или вставить новую: "В операции должен использоваться обновляемый запрос."

Проверь разрешения на каталог где у тебя лежит mdb-файл.
1) На сам файл у юзера под которым работает сайт должны быть права на модификацию (ну это я думаю есть
2) На каталог где нахоится файл должно быть право создания файлов (и их последующей модификации), т.к. при операциях обновления для блокировок создается файл .ldb. Если access не сможет создать этот файл то база будет в режиме readonly
Re: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 01.11.04 10:08
Оценка:
Здравствуйте, dmaster1, Вы писали:

D>Всем привет! Подскажите пожалуйста как разрешить следующую проблему.

D>Есть у меня база данных аля MS Access. Пишу ASP.NET'ую морду для доступа к этой базе. Читаю из неё без проблем, а вот удалить запись, обновить или вставить нговую не удается. Получаю exeption следующего содержания:
D> — при попытке удаления записи: "Невозможно удаление записей из указанных таблиц."
D> — при попытке обновить запись или вставить новую: "В операции должен использоваться обновляемый запрос."
D>Что бы это могло значить и в чем может быть проблема?
D>Использую ADO.NET'ый механизм:
D> // connection string
D> protected string _sConnection = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\olContacts.mdb";

D> Например, обновляю запись так:


D> private void btnUpdate_Click(object sender, System.EventArgs e)

D> {
D> string sUpdateSQL = "UPDATE Users SET ";
D> sUpdateSQL += "GroupID='" + txtGroupID.Text + "',";
D> sUpdateSQL += "NickName='" + txtNickName.Text + "',";
D> sUpdateSQL += "UserOrder='" + txtOrder.Text + "',";
D> sUpdateSQL += "ItemData='" + txtItemData.Text + "' ";
D> sUpdateSQL += " WHERE ItemData=" + lstUsers.SelectedItem.Value;
D> // ADO.NET objects
D> OleDbConnection oleConnection = new OleDbConnection(_sConnection);
D> OleDbCommand oleCommand = new OleDbCommand(sUpdateSQL,oleConnection);
D> int nUpdated = 0;
D> try
D> {
D> oleConnection.Open();
D> nUpdated = oleCommand.ExecuteNonQuery();
D> lblInfo.Text = nUpdated.ToString() + " records updated.";
D> }
D> catch(Exception err)
D> {
D> lblInfo.ForeColor = Color.Purple;
D> lblInfo.Text = "Error updating record. ";
D> lblInfo.Text = err.Message;
D> }
D> finally
D> {
D> if( oleConnection != null )
D> {
D> oleConnection.Close();
D> }
D> }
D> }

D> А удаляю например так:


D> private void btnDelete_Click(object sender, System.EventArgs e)

D> {
D> string sDeleteSQL = "DELETE FROM Users ";
D> sDeleteSQL += "WHERE ItemData=" + lstUsers.SelectedItem.Value;
D> // ADO.NET objects
D> OleDbConnection oleConnection = new OleDbConnection(_sConnection);
D> OleDbCommand oleCommand = new OleDbCommand(sDeleteSQL,oleConnection);
D> int nDelItems = 0;
D> try
D> {
D> oleConnection.Open();
D> nDelItems = oleCommand.ExecuteNonQuery();
D> lblInfo.Text = nDelItems.ToString() + " records deleted.";
D> }
D> catch(Exception err)
D> {
D> lblInfo.ForeColor = Color.Purple;
D> lblInfo.Text = "Error deliting record. ";
D> lblInfo.Text = err.Message;
D> }
D> finally
D> {
D> if( oleConnection != null )
D> {
D> oleConnection.Close();
D> }
D> }
D> if( nDelItems > 0 )
D> {
D> FillUsersList();
D> }
D> }

D>Что тут неверно?


D>Спасибо всем неравнодушным!


Проблема разрешилась!
В IIS'е нужно было прописать запуск этой страницы от имени Админа. И все сразу заработало.
Спасибо всем!
Re[2]: Добавление записей в БД Access с помощью ADO.NET
От: just_dmitry Россия www.parsec-club.ru
Дата: 01.11.04 10:11
Оценка:
Здравствуйте, dmaster1, Вы писали:
D>Проблема разрешилась!
D>В IIS'е нужно было прописать запуск этой страницы от имени Админа. И все сразу заработало.
D>Спасибо всем!

Угу, а еще в БД очеь удобно ковыряться от имени sa (MS SQL) или SYSTEM (Oracle). Тоже никаких ограничений.
Re[3]: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 01.11.04 10:54
Оценка:
Здравствуйте, just_dmitry, Вы писали:

_>Здравствуйте, dmaster1, Вы писали:

D>>Проблема разрешилась!
D>>В IIS'е нужно было прописать запуск этой страницы от имени Админа. И все сразу заработало.
D>>Спасибо всем!

_>Угу, а еще в БД очеь удобно ковыряться от имени sa (MS SQL) или SYSTEM (Oracle). Тоже никаких ограничений.


Намек на неграмотный подход к решению проблемы???
Тогда подскажи плиз, как разрешить её по-умному???
Буду благодарен!
Re[4]: Добавление записей в БД Access с помощью ADO.NET
От: just_dmitry Россия www.parsec-club.ru
Дата: 01.11.04 11:16
Оценка:
D>Намек на неграмотный подход к решению проблемы???

http://www.rsdn.ru/Forum/Message.aspx?mid=878069&amp;only=1
Автор: just_dmitry
Дата: 01.11.04
смотрел?
Re[5]: Добавление записей в БД Access с помощью ADO.NET
От: shinjo  
Дата: 02.11.04 03:24
Оценка:
Здравствуйте, just_dmitry, Вы писали:

D>>Намек на неграмотный подход к решению проблемы???


_>http://www.rsdn.ru/Forum/Message.aspx?mid=878069&amp;only=1
Автор: just_dmitry
Дата: 01.11.04
смотрел?


ПОКАЖИТЕ ПОЖАЛУЙСТА ПРИМЕР где там добавлять квадратные скобки ????

INSERT INTO guestbook(nick) VALUES (['боб']) так ????

и где менять права на запуск страницы от имени администратора тоже напиши об этом поподробнее.
Я пишу гостевуху на ASP.NET вот вставка записей не работает ((( такаяже проблема.....
И в SQL я новичек.
Re[6]: Добавление записей в БД Access с помощью ADO.NET
От: vvvoloshin1 Канада  
Дата: 02.11.04 04:03
Оценка:
INSERT INTO guestbook(nick) VALUES (['боб']) так ????

Нет не так ....


SELECT [Table].[Field] FROM .......

Скобки нужны чтобы твой запрос не использовал системные обозначения (зарезервированные слова)..
Re[7]: Добавление записей в БД Access с помощью ADO.NET
От: shinjo  
Дата: 02.11.04 04:28
Оценка:
Здравствуйте, vvvoloshin1, Вы писали:

V>INSERT INTO guestbook(nick) VALUES (['боб']) так ????


V>Нет не так ....



V>SELECT [Table].[Field] FROM .......


V>Скобки нужны чтобы твой запрос не использовал системные обозначения (зарезервированные слова)..


Понятно впринципе... но и непонятно так что мне в моем например запросе в крвадратные скобки поставить ???

INSERT INTO [guestbook]([nick]) VALUES я вообще запутался...

и вот есщё 1 вопрос который меня мучает уже целых 2 месяца. Вот смотри у меня есть например фаил pivko.mdb. К нему в asp.net странице обращаються пользователи.
У меня там в обращении стоит

OleDbConnection.Open();
тут я получаю всё в дата адаптер
потом датаадаптером Fill делаю
но это не столь важно что я тут делаю суть вот в следующем !
OleDbConnection.Close();

В промежуток времени когда в программе открыто соеденение с этой базой
другой пользователь запустив мою страницу сможет прочитать из неё данные или записать их в базу данных.
Или ADO.NET умное оно создает очередь или стэк койнибудь...
Re[8]: Добавление записей в БД Access с помощью ADO.NET
От: dmaster1  
Дата: 02.11.04 06:53
Оценка:
Здравствуйте, shinjo, Вы писали:

S>Здравствуйте, vvvoloshin1, Вы писали:


V>>INSERT INTO guestbook(nick) VALUES (['боб']) так ????


V>>Нет не так ....



V>>SELECT [Table].[Field] FROM .......


V>>Скобки нужны чтобы твой запрос не использовал системные обозначения (зарезервированные слова)..


S>Понятно впринципе... но и непонятно так что мне в моем например запросе в крвадратные скобки поставить ???


S>INSERT INTO [guestbook]([nick]) VALUES я вообще запутался...


S>и вот есщё 1 вопрос который меня мучает уже целых 2 месяца. Вот смотри у меня есть например фаил pivko.mdb. К нему в asp.net странице обращаються пользователи.

S>У меня там в обращении стоит

S>OleDbConnection.Open();

S>тут я получаю всё в дата адаптер
S>потом датаадаптером Fill делаю
S>но это не столь важно что я тут делаю суть вот в следующем !
S>OleDbConnection.Close();

S>В промежуток времени когда в программе открыто соеденение с этой базой

S>другой пользователь запустив мою страницу сможет прочитать из неё данные или записать их в базу данных.
S>Или ADO.NET умное оно создает очередь или стэк койнибудь...


Проблема на самом деле серьезная. В народе носит название "проблема одновременного (или конкурентного) доступа". В книжке М. Макдрнальда ASP.NET про неё пару слов написано, что мол у DataAdapter'a есть событие RowUpdated, которое "происходит после каждой отдельной операции вставки, обновления или удаления, но перед тем, как генерируется исключение." (см. стр. 433)
А вот и пример от туда:

Public Sub OnRowUpdated(sender As object, e As OleDbRowUpdatedEventArgs)
'проверка, были ли обработаны какие записи.
' если ни одной, то выражение не было выполнено, как предполагалось.
If e.RecordsAffected() <1 Then
'выявление типа ошибки
Select Case e.StatementType
Case StatementType.Delete
lstErrors.Items.Add("Not deleted: " & e.Row("au_id"))
Case StatementType.Insert
lstErrors.Items.Add("Not inserted: " & e.Row("au_id"))
Case StatementType.Update
lstErrors.Items.Add("Not updated: " & e.Row("au_id"))
End Select

'можно заставить ADO.NET игнорировать проблему
'и продолжать обновление других строк.
e.Status = UpadteStatus.SkipCurrentRow
End If
End Sub
Re[6]: Да нигде!!!
От: just_dmitry Россия www.parsec-club.ru
Дата: 02.11.04 08:45
Оценка:
Здравствуйте, shinjo, Вы писали:

S>ПОКАЖИТЕ ПОЖАЛУЙСТА ПРИМЕР где там добавлять квадратные скобки ????


S>INSERT INTO guestbook(nick) VALUES (['боб']) так ????


S>и где менять права на запуск страницы от имени администратора тоже напиши об этом поподробнее.

S>Я пишу гостевуху на ASP.NET вот вставка записей не работает ((( такаяже проблема.....
S>И в SQL я новичек.

Обясняю популярно.
Квадратные скобки нужны как тут верно подметили, когда у вас таблицы или поля в них имеют имена, аналогичные которые имеют для Access (в данном случае) специальный смысл. Ни GUSTBOOK, ни NICK, ни даже USERS (95%) таковыми не являются! Если бы и являлись, то вы бы получили ошибку "Неверное SQL-выражение", а уж никак не "невозможно удалить".

Невозможность удаления — прямое указание на доступ readonly тили на попытку обновления связанных таблиц одним запросом, когда access не может понять как ему провести обновление. Показанный здесь
Автор: dmaster1
Дата: 31.10.04
запрос неопределенностей не имеет, поэтому третий раз говорю — проверьте права
Автор: just_dmitry
Дата: 01.11.04
на MDB-файл и на каталог где он лежит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.