![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему возникает ошибка при редактировании таблицы через BDE ? [D7, MSSQL]
GreySerg © (2005-06-09 11:12:00)Есть таблица в БД MS SQL :
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[document]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[document]
GO
CREATE TABLE [dbo].[document] (
[id] [int] NOT NULL ,
[name] [varchar] (8000) COLLATE Cyrillic_General_CI_AS NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[document] WITH NOCHECK ADD
CONSTRAINT [PK_document] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO
заполняю ее данными :
INSERT INTO document
(id, name)
SELECT 1, replicate('a', 255)
UNION ALL
SELECT 2, replicate('b', 255)
UNION ALL
SELECT 3, replicate('c', 256)
есть такой код доступа к таблице через BDE:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SetDBParams(DataBase1,'mydb.cfg');
with Table1 do
begin
Exclusive := False;
IndexFieldNames := 'id';
TableName := 'document';
Open;
while not Eof do
begin
Edit;
FieldByName('Name').Value := '34';
Next;
end;
end;
end;
почему возникает возникает ошибка "Couldn't perform the edit because another user changed the record", при редактировании записи (когда делаю Edit), у которой количество символов в name > 255 (в данной случае на записи с id =3) ?
Можно ли это как-то исправить ?
P.S. : переход на ADO не предлагать, т.к. слишком много кода надо переделать
sniknik (2005-06-09 15:06:00) [1]Query1.SQL.Add('Update document SET');
Query1.SQL.Add('Name = :Name1 + :Name2');
s := '';
for i:= 1 to 250 do
S:= s + 'b';
Query1.ParamByName('name1').AsString := S;
Query1.ParamByName('name2').AsString := S;
сквозь BDE проскочет, а серверу пофигу он поддерживает он сложит.
Ega23 (2005-06-09 13:21:00) [2]ошибок не выдает, но вставляет белиберду ,если Length(S)> 255
Потому, что это уже BLOB.
GreySerg (2005-06-09 13:00:00) [3]получается нет выхода , если использовать BDE
попробовал через BDE Tquery сделать :
with Table1 do
begin
Exclusive := False;
IndexFieldNames := 'id';
TableName := 'document';
Open;
while not Eof do
begin
Query1.SQL.Clear;
Query1.SQL.Add('Update document SET ');
for i := 0 to FieldCount-1 do
begin
if (i <> 1) and (Fields[i].FieldName <> 'id') then Query1.SQL.Add(',');
if Fields[i].FieldName <> 'id' then
Query1.SQL.Add(Fields[i].FieldName + ' = :' + Fields[i].FieldName);
end;
Query1.SQL.Add('where id =' + FieldByName('id').AsString);
Query1.ParamByName('name').AsString := '34';
Query1.ExecSQL;
Next;
end;
end;
вроде работает , но если слегка изменить код
s := '';
for i:= 1 to 256 do
S:= s + 'b';
Query1.ParamByName('name').AsString := S;
ошибок не выдает, но вставляет белиберду ,если Length(S)> 255
Anatoly Podgoretsky (2005-06-09 11:46:00) [4]БДЕ не поддерживает строковые поля свыше 255 символов.
GreySerg (2005-06-09 11:27:00) [5]та же ошибка на Edit
Ega23 (2005-06-09 11:22:00) [6]Попробуй
while not Eof do
begin
Edit;
FieldByName('Name'). AsString:= '34';
Post;
Next;
end;