![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Редактирование данных по сети [D6, MS Access]
saNat © (2008-04-09 10:25:00)Доброго времени суток, Мастера (:
Обнаружил в проекте проблему. Приложение соединяется с БД посредством ADO. Путь хранится в отдельном файле конфигурации. Если подключаться к БД локально, т.е. указан путь типа C:\MyApp\MyDB.mdb, то все операции выполняются корректно. Если же указан сетевой путь, например, \\PC\MyBase\MyDB.mdb, то возникают ошибки.
Подключение к БД:
TDBModule=Class(TDataModule)
DBConnection :TADOConnection;
DBQuery: TADOQuery;
Procedure DataModuleCreate(Sender:TObject);
Procedure DBConnectionBeforeConnect(Sender:TObject);
{-----вырезано-----}
Private
FDBPath :String;
{-----вырезано-----}
Function GetDBConnect:Boolean;
Procedure SetDBConnect(Value:Boolean);
Function GetDBPath:String;
Procedure SetDBPath(Value:String);
{-----вырезано-----}
Public
Published
Property DBConnect:Boolean
Read GetDBConnect
Write SetDBConnect;
Property DBPath:String
Read GetDBPath
Write SetDBPath;
{-----вырезано-----}
End;
{-----вырезано-----}
Function TDBModule.GetDBConnect:Boolean;
Begin
Result:=DBConnection.Connected;
End;
Procedure TDBModule.SetDBConnect(Value:Boolean);
Begin
Try
DBConnection.Connected:=Value;
Except
MessageDlg('Ошибка соединения с базой данных.',mtWarning,[mbOk],0);
End;
End;
Procedure TDBModule.DBConnectionBeforeConnect(Sender:TObject);
Begin
DBConnection.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source="'+FDBPath+'";'+
'Persist Security Info=False;'+
'Jet OLEDB:Database Password=0322907';
End;
Пример использования:
Procedure TDeskTop.PostDeleteClick(Sender:TObject);
Begin
If Not DBModule.DBConnect
Then
DBModule.DBConnect:=True;
If DBModule.DBConnect And
(PostList.ItemIndex<>-1) And
(MessageDlg('Восстановление удаленных данных невозможно. Продолжить?',mtConfirmation,[mbYes,mbNo],0)=mrYes)
Then
Begin
Try
DBModule.DBQuery.Close;
DBModule.DBQuery.SQL.Clear;
DBModule.DBQuery.SQL.Add('Delete From Должности');
DBModule.DBQuery.SQL.Add('Where (Наименование=:UserPost)');
DBModule.DBQuery.Parameters.ParseSQL(DBModule.DBQuery.SQL.Text,True);
DBModule.DBQuery.Parameters.ParamByName('UserPost').Value:=PostList.Items.String s[PostList.ItemIndex];
DBModule.DBQuery.ExecSQL;
DBModule.DBQuery.Close;
DBModule.DBQuery.SQL.Clear;
PageControl.OnChange(Self);
Except
MessageDlg('Удаление записи в данный момент невозможно.',mtWarning,[mbOk],0);
End;
End;
End;
В случае "сетевого подключения" при попытке выполнить запрос получаю сообщение IDE "....EOLEException with message 'Невозможно удаление записей из указанных таблиц'..."
saNat (2008-04-09 10:49:00) [1]Голова сегодня работать отказывается. Спасибо Вам (: - доступ был только на чтение.
Ветку можно закрыть.
sniknik (2008-04-09 10:41:00) [2]> В операции должен использоваться обновляемы запрос
так понимаю справки у тебя в аксессе нет, или на F1 нажать не в состоянии...
> Подскажите, пожалуйста.
так и быть. нажал за тебя -
В операции должен использоваться обновляемый запрос. (Ошибка 3073)
Попытка запустить, открыть или изменить запрос, который не является обновляемым.
Возможные причины:
Попытка запустить запрос, в котором предпринимается попытка обновить необновляемое поле. Например, создан запрос, в котором предпринимается попытка обновить поле на стороне «один» отношения «один-ко-многим».
Попытка использовать устаревший метод OpenQueryDef для запроса, находящегося в базе данных, открытой с доступом только для чтения.
База данных может быть доступной только для чтения по одной из следующих причин:
База данных была открыта только для чтения с помощью метода OpenDatabase или элемента управления Data Visual Basic.
Файл базы данных определен с доступом только для чтения в сетевой операционной системе.
Пользователь не имеет привилегий записи в этот файл базы данных в сетевой среде.
Закройте базу данных, снимите ограничение доступа только для чтения и вновь откройте файл с доступом для чтения/записи.
Отсутствуют разрешения на внесение изменений в запрос. Для изменения разрешений обратитесь к системному администратору или создателю таблицы или запроса.
saNat (2008-04-09 10:30:00) [3]Вот еще пример: хочу вставить новую запись:
Function TDBModule.GetUserCreate:Boolean;
Begin
Result:=True;
DBQuery.Close;
DBQuery.SQL.Clear;
DBQuery.SQL.Add('Select Идентификатор From Пользователи');
DBQuery.SQL.Add('Where (Пользователь=:UserName)');
DBQuery.Parameters.ParseSQL(DBQuery.SQL.Text,True);
DBQuery.Parameters.ParamByName('UserName').Value:=UserName;
DBQuery.Open;
DBQuery.First;
If DBQuery.EOf
Then
Begin
DBQuery.Close;
DBQuery.SQL.Clear;
DBQuery.SQL.Add('Insert InTo Пользователи (Пользователь,Пароль,Тип,Статус)');
DBQuery.SQL.Add('Values (:UserName,:UserPassword,2,0)');
DBQuery.Parameters.ParseSQL(DBQuery.SQL.Text,True);
DBQuery.Parameters.ParamByName('UserName').Value:=UserName;
DBQuery.Parameters.ParamByName('UserPassword').Value:=UserPasword;
DBQuery.ExecSQL;
End
Else
Begin
MessageDlg('Учетная запись "'+UserName+'" существует.',mtWarning,[mbOk],0);
Result:=False;
End;
DBQuery.Close;
DBQuery.SQL.Clear;
End;
Получаю ошибку: "В операции должен использоваться обновляемы запрос"
Предполагаю, что в строке подключения чего-то нехватает. Подскажите, пожалуйста.