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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2008, 12:37   #1
Larsus
 
Регистрация: 09.09.2008
Сообщений: 6
По умолчанию База DBF работа с SQL запросами

Доброго времени суток! плиз помагите разобраться, никак не получается сделать простой запрос. Имеется несколько баз данных с расширением *.dbf мне необходимо открывать их и делать с ними несколько запросов, открыть и вывести данные из базы получается но обработать простейший запрос Like не выходит выдаёт ошибку! ошибка(Project raised exception class EOLeException with message '[Microsoft][Драйвер ODBC dBase] Слишком мало параметров. Требуется 1'. Process stopped/ Use Step or Run to continue.

вот код программы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, Grids, DBGrids, StdCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    OpenDialog1: TOpenDialog;
    DBGrid1: TDBGrid;
    Edit1: TEdit;
    procedure N2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SqlUpdate;
    procedure Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1   : TForm1;

  Filname : string;
  Connect : string;
  inn,s   : string;

implementation

uses Unit2;

{$R *.dfm}
procedure TForm1.SqlUpdate;
 BEGIN
  s:='where '+inn;
  DataModule2.ADOQuery1.Close;
  DataModule2.ADOQuery1.SQL.Clear;
  DataModule2.ADOQuery1.SQL.Add('Select *');
  DataModule2.ADOQuery1.SQL.Add('From '+Filname);
  DataModule2.ADOQuery1.SQL.Add(s);
  DataModule2.ADOQuery1.Open;
 END;

procedure TForm1.N2Click(Sender: TObject);
 BEGIN
  If OpenDialog1.Execute then
     Begin
      DataModule2.ADOQuery1.ConnectionString:=connect+ExtractFilePath(OpenDialog1.FileName);
      Filname:=ExtractFileName(OpenDialog1.FileName);
      DataModule2.ADOQuery1.Close;
      DataModule2.ADOQuery1.SQL.Clear;
      DataModule2.ADOQuery1.SQL.Add('SELECT *');
      DataModule2.ADOQuery1.SQL.Add('FROM '+Filname);
      DataModule2.ADOQuery1.Open; 
     End;
 END;

procedure TForm1.FormCreate(Sender: TObject);
 BEGIN
  Connect:='Provider=MSDASQL.1;Persist Security Info=False;Data Source=Ôàéëû dBASE;Mode=ReadWrite;Initial Catalog=';
 END;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
 BEGIN
  inn:='(NAME like"'+Edit1.Text+'%")';
  SqlUpdate;
 END;

END.
Larsus вне форума Ответить с цитированием
Старый 09.09.2008, 12:58   #2
Larsus
 
Регистрация: 09.09.2008
Сообщений: 6
По умолчанию

пипл ну очень нужна помощь главное запрос Select * From (имя таблицы) обрабатывается, а запрос Select * from (имя таблицы) where NAME like "Иван%") не выполняется в чём дело никак не пойму может у мну синтаксис не правильный, но тогда я думаю вышла бы ошибка о неправильном синтаксисе, а выходит, как я писал уже выше: ошибка(Project raised exception class EOLeException with message '[Microsoft][Драйвер ODBC dBase] Слишком мало параметров. Требуется 1'. Process stopped/ Use Step or Run to continue.
Larsus вне форума Ответить с цитированием
Старый 09.09.2008, 13:10   #3
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Попробуйте заменить двойные кавычки в тексте запроса на одинарные. Возможно дело в этом.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 09.09.2008, 13:29   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

и пробелы добавить... как минимум перед WHERE
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.09.2008, 13:39   #5
MAcK
Форумчанин
 
Регистрация: 09.11.2006
Сообщений: 274
По умолчанию

вообще пройдись пошагово и посмотри на свой запрос
Единственный приличный формат, разработанный Microsoft'ом, - format c:
MAcK вне форума Ответить с цитированием
Старый 09.09.2008, 21:36   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
DataModule2.ADOQuery1.SQL.Add('SELECT *');
      DataModule2.ADOQuery1.SQL.Add('FROM '+Filname);
.....
  inn:='(NAME like"'+Edit1.Text+'%")';
Во-первых: зачем делаете такую "дикую" разбивку текста SQL?
Почему просто не задать:
DataModule2.ADOQuery1.SQL.Text:='se lect * from '+''''+Filname+''''+' where name like '+''''+Edit1.Text+''''+'%';
Во-вторых - надеюсь, что Filname - это название таблицы базы, а не текстового файла?
mihali4 вне форума Ответить с цитированием
Старый 10.09.2008, 00:10   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от mihali4
Edit1.Text+''''+'%'
ну я бы процентик все же поместил ПЕРЕД кавычкой )
у Вас получится like 'Тут_Текст_Edit1'%

а во вторых, тогда уже можно использовать
function QuotedStr(const S: string): string; из sysutils
будет ещё короче :-) :
Код:
  DataModule2.ADOQuery1.SQL.Text:='select * from '+QuotedStr(Filname)+
  ' where name like '+QuotedStr(Edit1.Text+'%');
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.09.2008, 00:33   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Все абсолютно верно подмечено, коллега!
Это я по стариковской привычке... Проще четыре раза тыркнуть по апострофу, чем набирать QuotedStr...
mihali4 вне форума Ответить с цитированием
Старый 10.09.2008, 08:05   #9
Larsus
 
Регистрация: 09.09.2008
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Во-вторых - надеюсь, что Filname - это название таблицы базы, а не текстового файла?
Да конечно я через OpenDialog открываю файлы базы данных в формате *.DBF
Larsus вне форума Ответить с цитированием
Старый 10.09.2008, 08:18   #10
Larsus
 
Регистрация: 09.09.2008
Сообщений: 6
По умолчанию

Товарищи, огромное спасибо за потраченное ваше время на просмотр темы, но вы немного ошибаетесь проблема не в синтаксисе запроса он оформлен, пусть может для кого то глуппо, но правильно и удобно для меня! В самом начале темы я писал какая выходит ошибка она никак не связана с синтаксисом!

Проблема как я понял заключается именно в формате базы данных, так как я создавал такой же структуру базу данных в Access и ничего не менял, кроме свойства connectionstring, открыл базу и, как не странно, запрос работает, и никакой ошибки! Так что теперь мой вопрос заключается в следующем как делать запросы с базами формата *.DBF. ????

P.S обратил внимание что когда выбераещь поставщика данных Microsoft.Jet.OLEDB.4.0(для аксесовских баз) во вкладке дополнительно, автоматически устанавливается галочка на Share Deny None, когда же выбираю поставщика данных Microsoft OLE DB provaider for ODBC Drivers (для баз данных формата *.DBF) данную галочку установить не получается так как возникает ошибка при проверке подключения.
Larsus вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База в инете... Stanislav БД в Delphi 3 12.03.2008 14:36
База SQL !!! Noor Помощь студентам 19 16.06.2007 09:53
Помогите с SQL-запросами DIMON_X БД в Delphi 3 22.04.2007 19:36
Работа с SQL-запросами Washington Общие вопросы Delphi 1 13.03.2007 01:28