Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2007, 21:03   #1
Zver
 
Регистрация: 08.02.2007
Сообщений: 7
По умолчанию Задержка добавления записи в базу Access из Dephi

Добрый день.

Столкнулся со следующей проблемой:

В отдельной форме вводятся данные полей, затем добавляется запись в уже подключенную базу Access:
Код:
with ADOQuery1 do
begin
ConnectionString := Global_DBConnection_String;
SQL.Text := 'SELECT key FROM MainTable';
Open;
Last;
UniqueNumber := 1 + StrToInt(FieldByName('key').AsString);
Close;
SQL.Text := 'INSERT INTO MainTable Values (' +
QuotedStr(IntToStr(UniqueNumber)) + ',' +
QuotedStr(ObjectNameBox.Text) + ',' +
QuotedStr(AdressBox.Text) + ',' +
QuotedStr(COUFNS.Text) + ',' +
QuotedStr(PlkaUFNS.Text) + ',' +
QuotedStr(COInspection.Text) + ',' +
QuotedStr(PlkaInspection.Text) + ',' +
QuotedStr(TORM.Text) + ',' +
QuotedStr(OutsideObjects.Text) +
')';
ExecSQL;
Close;
end;

Затем на основной форме обновляем таблицу:


ADOTable1.Active := False;
ADOTable1.Active := True;


Но новая запись видна в таблице, только если обновить ADOTable спустя секунд 5. Пробовал по-разному, все равно такая задержка..

БД локальная.

Подскажите, пожалуйста, если какой-то выход? Заранее спасибо)

Последний раз редактировалось Stilet; 16.05.2011 в 17:54.
Zver вне форума Ответить с цитированием
Старый 08.02.2007, 21:22   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Есть такой метод - Requery method (TCustomADODataSet).
mihali4 вне форума Ответить с цитированием
Старый 10.02.2007, 02:31   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Все предыдущее обсуждение слетело по объективным причинам, как выяснилось. Ну, да не беда.
Совет - минимально использовать закрытие/открытие Query, при большой базе этот процесс занимает приличное время.
Конкретно по данному случаю - неправильные установки кэширования записей, мне так кажется.
mihali4 вне форума Ответить с цитированием
Старый 10.02.2007, 21:59   #4
Zver
 
Регистрация: 08.02.2007
Сообщений: 7
По умолчанию

Цитата:
Совет - минимально использовать закрытие/открытие Query, при большой базе этот процесс занимает приличное время.
База пока еще маленькая очень.)

Цитата:
Конкретно по данному случаю - неправильные установки кэширования записей, мне так кажется.
А какие именно установки?

Менял CacheSize в ADOTable - ноль эффекта(
Zver вне форума Ответить с цитированием
Старый 11.02.2007, 00:12   #5
Lynx
Пользователь
 
Аватар для Lynx
 
Регистрация: 09.02.2007
Сообщений: 49
По умолчанию

Попробуй обойтись без ADOTable, только используя ADOQuery
т.е. подруби Query к гриду и...
Код:
with ADOQuery1 do
begin
ConnectionString := Global_DBConnection_String;
SQL.Text := 'SELECT key FROM MainTable';
Open;
Last;
UniqueNumber := 1 + StrToInt(FieldByName('key').AsString);
Close;
SQL.Text := 'INSERT INTO MainTable Values (' +
QuotedStr(IntToStr(UniqueNumber)) + ',' +
QuotedStr(ObjectNameBox.Text) + ',' +
QuotedStr(AdressBox.Text) + ',' +
QuotedStr(COUFNS.Text) + ',' +
QuotedStr(PlkaUFNS.Text) + ',' +
QuotedStr(COInspection.Text) + ',' +
QuotedStr(PlkaInspection.Text) + ',' +
QuotedStr(TORM.Text) + ',' +
QuotedStr(OutsideObjects.Text) +
')';
ExecSQL;
Close;
sql.clear;
sql.add('SELECT * FROM MainTable');
open;
end;
Свой среди чужих
Чужой среди своих

Последний раз редактировалось Lynx; 11.02.2007 в 00:16.
Lynx вне форума Ответить с цитированием
Старый 11.02.2007, 14:34   #6
Zver
 
Регистрация: 08.02.2007
Сообщений: 7
По умолчанию

Пробую - после запроса на гриде вообще ничего не отображается.. Такое впечатление, что я что-то совсем очевидное не так сделал... =(

Вот маленький проект, где только грид и query. При создании формы query подключается к базе, и делает запрос 'SELECT * FROM MainTable'.
DBGrid1 подключен к ADOQuery1 через DataSource1. По идее на гриде должно появиться содержимое этой таблицы, но он пуст((

http://slil.ru/23910643

Подскажите, пожалуйста, что не так.
Zver вне форума Ответить с цитированием
Старый 11.02.2007, 17:23   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А кто поля в гриде определит, Пушкин?
А у Query?
А зачем вот эта строка:
ADOQuery1 := TADOQuery.Create(nil);
Ведь ADOQuery1 уже лежит на форме...
Дальше:
Цитата:
with ADOQuery1 do
begin
ConnectionString := Global_DBConnection_String;
active := false;
SQL.Text:='SELECT * FROM mtable';
active := true;
open;

end;
active := true и open... Зачем дважды открывать, ведь это одно и то же?

Последний раз редактировалось mihali4; 11.02.2007 в 17:30.
mihali4 вне форума Ответить с цитированием
Старый 11.02.2007, 17:32   #8
Lynx
Пользователь
 
Аватар для Lynx
 
Регистрация: 09.02.2007
Сообщений: 49
По умолчанию

Я конечно не профи но вот твой листинг, чуть корректированный
Код:
unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    ADOQuery1: TADOQuery;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure ConnectToMSAccessDB(lsDBName, lsDBPassword: string);
//    function GetDBPath(lsDBName: string): string;
    procedure ConnectToAccessDB(lDBPathName, lsDBPassword: string);
    { Public declarations }
  end;

var
  Form1: TForm1;
  Global_DBConnection_String : string;
implementation

{$R *.dfm}

procedure TForm1.ConnectToMSAccessDB(lsDBName, lsDBPassword: string);
var
  lDBpathName: string;
begin
  lDBpathName := ExtractFileDir(Application.ExeName);
  if  lDBpathName[length(lDBpathName)] <> '\' then
    begin
      lDBpathName := lDBpathName + '\';
    end;
  ConnectToAccessDB(lDBpathName + lsDBName,'');
{  lDBpathName := GetDBPath(lsDBName);
  if (Trim(lDBPathName) <> '') then
       ConnectToAccessDB(lDBPathName, lsDBPassword);
}

end;

{function TForm1.GetDBPath(lsDBName: string): string;
var
  lOpenDialog: TOpenDialog;
begin
  lOpenDialog := TOpenDialog.Create(nil);
  if FileExists(ExtractFileDir(Application.ExeName) + '\' + lsDBName) then
    Result := ExtractFileDir(Application.ExeName) + '\' + lsDBName
  else
    begin
      lOpenDialog.Filter := 'MS Access DB|' + lsDBName;
      if lOpenDialog.Execute then
        Result := lOpenDialog.FileName;
    end;
end;
}
procedure TForm1.ConnectToAccessDB(lDBPathName, lsDBPassword: string);
begin
Global_DBConnection_String :=
'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=' + lDBPathName + ';' +
'Persist Security Info=False;' +
'Jet OLEDB:Database Password=' + lsDBPassword+';'
;

//ADOQuery1 := TADOQuery.Create(nil);

with ADOQuery1 do
  begin
    ConnectionString := Global_DBConnection_String;
    active := false;
    SQL.Text:='SELECT * FROM MainTable';
    //active := true;
    open;
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    ConnectToMSAccessDB('base.mdb', '');
end;

end.
...
Свой среди чужих
Чужой среди своих

Последний раз редактировалось Lynx; 11.02.2007 в 17:36.
Lynx вне форума Ответить с цитированием
Старый 11.02.2007, 18:15   #9
Zver
 
Регистрация: 08.02.2007
Сообщений: 7
По умолчанию

А, я адски ступил.... -_-'
Сейчас попробую только через query все переправить, надеюсь пропадет задержка...

Спасибо вам огромное за советы!))) Чтобы я без вас делал))

P.S. Просьба не бить за глупые вопросы, я учусь только.. =)
Zver вне форума Ответить с цитированием
Старый 11.02.2007, 18:23   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
надеюсь пропадет задержка
Только при соблюдении следующего:
Квэри открывать только один раз - после присвоения Connection_String и первого текста SQL. Далее - квэри не закрывать (поскольку это не нужно для переназначения текста SQL) и использовать ExecSQL.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
dephi/sql автозаполнение таблицы??? Geddar Помощь студентам 12 23.05.2008 08:31
помогите зделать базу в access tolik Помощь студентам 4 13.05.2008 14:47
com порт и Dephi kwn Общие вопросы Delphi 0 22.04.2008 22:33
как выгрузить базу данных из MySQL в Access??? TRANE Помощь студентам 5 03.12.2007 13:22
добавления в готовую таблицу Strelka Microsoft Office Excel 1 09.03.2007 17:27