Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Вопрос по Lazarus и TSQLQuery  [new]
Tolik_tehno
Member

Откуда: с севера
Сообщений: 21
Подскажите, знатоки, такая ситуация осуществляю переход приложения из Delphi на Lazarus и столкнулся с проблемой. Приложение работает с dbf файлами. С выполнением select все нормально все отлично, но как только принимаюсь за update и insert все встает колом:(( Соединением осуществляю с помощью TODBCConnection, запрос пытаюсь выполнить через TSQLQuery, следующим образом:
function TForm2.NextValSeq(sequence_name : string) : integer;
var val : integer;
begin
  Form2.SQLQueryConnection.Close;
  Form2.SQLQueryConnection.SQL.Clear;
  Form2.SQLQueryConnection.SQL.Add('SELECT currval FROM sequence WHERE seq_name = "' + sequence_name + '"');
  Form2.SQLQueryConnection.Open;
  val := Form2.SQLQueryConnection.FieldValues['currval'];
  Form2.SQLQueryConnection.Close;
  Form2.SQLQueryConnection.SQL.Clear;
  Form2.SQLQueryConnection.SQL.Add('UPDATE sequence SET currval = ' + IntToStr(val + 1) + ' WHERE seq_name = "' + sequence_name + '"');
  Form2.SQLQueryConnection.execSQL;

  result := val + 1;
end;
При выполнении выходит ошибка "ODBC error details: LastReturnCode: SQL_ERROR; Record 1: SqlState:S1000; NativeError: 146; Message: [Microsoft][ODBC Visual FoxPro Driver]Cannot update the cursor.;"
Я так понимаю ошибку выдает одбс, может тогда я TODBCConnection не правильно настроил? Правда настроек по минимуму делал:
begin
  Connection.Driver:='Micosoft Visual FoxPro Driver';
  Connection.FileDSN:='D:\Project\Lazarus\challenge\data\';
  Connection.Connected:=True;
end;

Подскажите, где я ошибся. До этого (в Delphi) для соединения использовал ADOConnection , и все работало на ура, даже и проблемы такой не возникало.
18 янв 10, 00:16    [8199504]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по Lazarus и TSQLQuery  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 50864
Ошибок много, но не по теме топика
function TForm2.NextValSeq(sequence_name : string) : integer;
var val : integer;
begin
1. На время изменения строку необходимо блокировать

  Form2.SQLQueryConnection.Close; 2. Обращение к объекту из метода
  Form2.SQLQueryConnection.SQL.Clear;
  Form2.SQLQueryConnection.SQL.Add('SELECT currval FROM sequence WHERE seq_name = "' + sequence_name + '"'); 3. Отсутствие переменных запроса
  Form2.SQLQueryConnection.Open;
  val := Form2.SQLQueryConnection.FieldValues['currval'];
  Form2.SQLQueryConnection.Close;
  Form2.SQLQueryConnection.SQL.Clear;
  Form2.SQLQueryConnection.SQL.Add('UPDATE sequence SET currval = ' + IntToStr(val + 1) + ' WHERE seq_name = "' + sequence_name + '"');
  Form2.SQLQueryConnection.execSQL;

  result := val + 1;
end;

По теме плохого/хорошего ничего сказать не могу, на вид всё верно, execSQL стоит на нужном месте.
18 янв 10, 00:32    [8199530]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по Lazarus и TSQLQuery  [new]
Tolik_tehno
Member

Откуда: с севера
Сообщений: 21
andreymx,
По 1 пункту, вроде в описаниях на том же портале freepascal ничего о блокировании записи не было:( да и зачем мне ее блокировать, однопользовательское приложение ведь.
По 2 пункту, а зачем мне связанные переменные, ну сгенирировал текст запроса на ходу и послал его исполняться криминального ведь в этом нет ничего или я ошибаюсь ?
По 3 пункту, тож мне кажется execSQL на своем месте, но ошибка выходит:(( Да я уже просто отдельно insert выполнить отдельно пытаюсь - не выходит. И ведь нигде прочитать ни могу ни о чем подобном, может кто направление подскажет?
18 янв 10, 00:43    [8199542]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по Lazarus и TSQLQuery  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Tolik_tehno
Подскажите, где я ошибся. До этого (в Delphi) для соединения использовал ADOConnection , и все работало на ура, даже и проблемы такой не возникало.

Так а сейчас у тебя ODBC, который работает криво. Возможно подбор настроек немного поможет. У тебя наверно еще где то открыта таблица, тогда это стандартное поведение по умолчанию. А АДО наверно в Лазарусе нет?
18 янв 10, 08:56    [8199901]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по Lazarus и TSQLQuery  [new]
Tolik_tehno
Member

Откуда: с севера
Сообщений: 21
Anatoly Podgoretsky,
Угу, нет ADO или я плохо искал. Таблиц открытых больше нет. Я использую одно соединение TSQLQuery и его по мере необходимости, очищаю, закрываю, открываю, выполняю в зависимости от задач. Насчет кривых параметров - вот куда можно попробовать покопать ? У меня такое подозрение что все очень просто должно быть и логично, но почему то не получается:(
18 янв 10, 11:50    [8200920]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по Lazarus и TSQLQuery  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Tolik_tehno
Anatoly Podgoretsky,
Угу, нет ADO или я плохо искал. Таблиц открытых больше нет. Я использую одно соединение TSQLQuery и его по мере необходимости, очищаю, закрываю, открываю, выполняю в зависимости от задач. Насчет кривых параметров - вот куда можно попробовать покопать ? У меня такое подозрение что все очень просто должно быть и логично, но почему то не получается:(

По поводу параметров ODBC не могу помочь, я не тратил свое время на изучение, при наличии ADO. Но поведение характерное для ODBC
18 янв 10, 12:12    [8201147]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить