Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему возникает ошибка при редактировании таблицы через 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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо