BG Development


  Reply to this topicStart new topicStart Poll

> Проблем при работата с ТDBNavigator в Lazarus, Грешка при натискане на бутона Refresh
Бай Аз
Публикувано на: 01-11-2022, 09:46
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 71
Регистриран на: 04.02.21




Здравейте!

Правя пример с използване на Sqlite.db в Lazarus.

В базата данни имам една таблица с няколко колони. На формата съм сложил SQLite3Connection1, SQLTransaction1, SQLQuery1, DataSource1, DBGrid1 и DBNavigator1. Всички компоненти са свързани взаимно и всичко работи.

Имам бутони за създаване на база данни, за свързване към база данни и за преглед на данните в DBGrid1. Всичко работи.
Искам да демонстрирам работата с ТDBNavigator. DBNavigator1 е свързан с DataSource1 и всички бутони в него работят, освен бутон Refresh.

При натискане на бутона Refresh се появява съобщение за грешка с текст: SQLQuery1: Must apply updates before refreshing data

Пробвах много неща, за да реша проблема: включвах се директно към базата данни, променях базата - изтрих колоната за autoincrement, променях много настройки в компонентите, четох в интернет в интернет и не намерих нищо подходящо като решение.

Зная, че тук има опитни хора в работата с Делфи (в случая ще решението ще стане и за Lazarus) и се надявам, че някой ще ми помогне да намеря решение!


Желая на всички приятен ден!


(Нужно ми е решение само с дадените компоненти и по возможност без допълнителни бутони и процедури)
PMEmail Poster
Top
ivanov03
Публикувано на: 03-11-2022, 06:07
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 87
Регистриран на: 14.12.12




Здравей!

Сблъсквал съм се с подобни проблеми.
Ето едно просто решение: да си направиш бутон "Запис на данните"(или Refresh) и в него да напишеш следния код:

CODE
if MessageDlg('Подтвърждение', 'Действително ли желаете да обновите данните в базата?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
               begin
                   SQLQuery1.ApplyUpdates();  // изпълнение на операцията обновяване
                   SQLTransaction1.Commit;    // потвърждение на транзакцията
                   ShowAll; // извикване на примерна процедура за показване на всичко от дадената таблица
                   ShowMessage(' Данните са обновени успешно!');
               end
else
               exit;


Сега видях, че си писал, ако може без допълнителни бутони.

Тогава, едно от възможните решения е: чрез събитието OnBeforeAction на TDbNavigator-а:

CODE
procedure TForm1.DBNavigator1BeforeAction(Sender: TObject;
 Button: TDBNavButtonType);
begin
 if Button = nbRefresh then // ako e натиснат бутон Refresh тогава:
 begin
   ...//тук копираш горепосочения код
 end;
end;


Това е от мен!


Това мнение е било редактирано от ivanov03 на 03-11-2022, 06:12
PM
Top
Бай Аз
Публикувано на: 03-11-2022, 13:14
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 71
Регистриран на: 04.02.21




Благодаря много, Иванов!

Току що го изпробвах - и при двата варианта работи перфектно!

Пробвах го на 32 битовата версия на Лазарус 2.24, а довечера ще го пробвам и на 64 битовата, и ще пиша какво е станало.

(Иначе за моя пример ще оставя втория вариант: без допълнителен бутон, като съм сложил една допълнителна проверка - дали има отворена БД?)

Желая на всички приятен ден и всичко най-хубаво!
PMEmail Poster
Top
Бай Аз
Публикувано на: 03-11-2022, 14:51
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 71
Регистриран на: 04.02.21



(Не мога да си редактирам мнението, явно има някакво времево ограничение за редакция тук, затова пиша нов пост)

Ще дам кода в две от процедурите, които споменахме тук, за да могат тези, които се учат, да видят как става:

Първата е при вариант 1, когато правим нов бутон за обновяване:

CODE
procedure TForm1.Button8Click(Sender: TObject);// бутон Обновяване
begin
  if SQLQuery1.Active = true then             // проверяваме дали има данни в DBGrid1
        begin
          try
            if MessageDlg('Подтвърждение', 'Действително ли желаете да обновите данните в базата?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
               begin                          // в тази част обновяваме данните
                   SQLQuery1.ApplyUpdates();  // изпълнение на операцията
                   SQLTransaction1.Commit;    // потвърждение на транзакцията
                   ShowAllUsers;              // извикване на процедурата за показване на всички потребители
                   ShowMessage(' Данните са обновени успешно!');
               end
            else
               exit;
          except
             ShowMessage(' Грешка при изпълнение!');
             SQLQuery1.Active:= false;
             exit;
          end;
        end
  else
        ShowMessage(' Не е осъществена връзка с базата от данни!');
        exit;
end;


А втората е за показване на всички записи от таблицата потребители:

CODE
procedure TForm1.ShowAllUsers;  // показване на всичко от таблицата потребители
begin
 if SQLQuery1.Active = true then
        begin
         try
             Form1.SQLQuery1.Active:= false;
             Form1.SQLQuery1.SQL.Clear;
             Form1.SQLQuery1.sql.add('SELECT * from  потребители');
             Form1.SQLQuery1.Open;
         except
             ShowMessage(' Грешка при изпълнение SQL заявката!');
             SQLQuery1.Active:= false;
             exit;
         end;
        end
      else
        ShowMessage(' Не е осъществена връзка с базата от данни!');
        exit;
end;


Не се притеснявайте, ако някой не разбира нещо, нека да зададе въпрос!
PMEmail Poster
Top
Бай Аз
Публикувано на: 04-11-2022, 08:41
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 71
Регистриран на: 04.02.21




Здравейте!

Вчера вечерта изпробвах програмата по двата начина и на 64 битовата версия на Lazarus, и всичко работи чудесно!

В тази тема можете да зададете въпрос за работата с бази данни в Lazarus, а аз ще преглеждам темата и ще се старая да отговарям на въпросите!

Желая на всички приятен ден и всичко най-хубаво!
PMEmail Poster
Top
Бай Аз
Публикувано на: 25-11-2022, 10:34
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 71
Регистриран на: 04.02.21




Здравейте!

За свързване с база данни MySQL

Тук ни трябва динамична библиотека (libmysql.dll), която трябва да поставим в папката(директорията) на проекта. А тази библиотека я вземаме от папката където сме инсталирали MySQL - от папката Lib. Библиотеката за последната версия на MySQL е версия 8.0.31.(Версиите трябва да съвпадат)

Друго важно нещо за локално свързване - не успях да се свържа чрез сървърите XAMPP и WAMP. Успях чрез пряка инсталация на MySQL и направих базата данни чрез Workbench и SQL заявки.

Ето какво написах в MySQL80Connection1:

DataBaseName: new_base (името на базата ни)
Host: localhost
Port: 3306
Pasword: root (вие ще зададете своя парола)
UserName: root (вие ще зададете свое потребителско име)


За свързване с база данни PostrgreSQL

Тук е почти същото само синтаксисът е леко различен.
Разлика има в това, че се ползват четири динамични библиотеки, ако някой се интересува, ще напиша кои точно са те.

Ако имате въпроси за ползването на бази от данни в Lazarus, задавайте ги тук, аз ще следя темата.


Желая ви всичко най-добро!


PMEmail Poster
Top
Бай Аз
Публикувано на: 29-11-2022, 13:38
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 71
Регистриран на: 04.02.21




Здравейте!

Успях да се свържа с базата във WAMP сървър!
Направих си нов потребител с парола и всички права, и поставих в проекта динамичната библиотека (libmysql.dll) версия 8.0.27, която се ползва в този сървър и стана!

В XAMPP сървър не успявам да се свържа, вероятно защото той работи с Maria.db, а конекторът в Lazarus е предназначен за работа с MySql.


Ако имате въпроси за работата с бази данни в Lazarus - питайте тук! А аз ще следя темата и ще се стремя да отговоря.
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0