ADOConnection1 + ADOQuery1+DataSource1
67 сообщений
#17 лет назад
Вытягиваю эти компоненты на форму настраиваю ADOConnection далее в компоненте ADOQuery в свойстве DATADource выбираю DataSource1 в свойстве connection выбираю ADOConnection1 а вот в компоненте DataSource1 в свойстве DataSet ниче не выбирается.. Почему ?? У кого была такая проблема ?? Недавно все работало писал прогу и вдруг начались эти партаки .. думал может че в коде намудрил, перезапускаю делфи создаю новый проект вытаскиваю эти компоненты и пытаюсь их связать но ниче не получается.. Что за чудо глюк ??? (делаю я это в delphi 7)
1895 сообщений
#17 лет назад
Ваш код в студию (filebeam.com - отличный обменник), посмотрим, скорее всего это баг среди а не самой делфи.
67 сообщений
#17 лет назад
Блин, я перезагрузил комп создал новуб БД в акцесе с одной табличкой создал новый проект в делфи и все таже фигня не могу соеденить эти компоненты... у меня еще никогда не было такого глюка 
1895 сообщений
#17 лет назад
Если взять DataSource и в нем указать DataSource = ADOQuery1, то тогда уже в самом ADOQuery нельзя выбрать DataSource, и наоборот, проверьте!
1895 сообщений
#17 лет назад
Вот пример рабочего кода, это текст DFM-ки, думаю знаете что с этим делатьobject Form1: TForm1
Left = 289
Top = 239
Width = 870
Height = 640
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style =
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 32
Top = 232
Width = 657
Height = 289
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style =
end
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\db1.mdb;Uid=Admi' +
'n;Pwd=;'
LoginPrompt = False
Left = 40
Top = 104
end
object ADOQuery1: TADOQuery
Active = True
Connection = ADOConnection1
CursorType = ctStatic
Parameters = <>
SQL.Strings = (
'select * from tb;')
Left = 40
Top = 136
end
object DataSource1: TDataSource
DataSet = ADOQuery1
Left = 40
Top = 176
end
end
67 сообщений
#17 лет назад
Если чесно то нет ) думаю нужно както записать этот код в dfm файл 
1895 сообщений
#17 лет назад
Можна записать а можно и в редакторе просматривать как текст, на форме визиваете меню "View as text", а в редакторе потом "view as form", элементарно )
67 сообщений
#17 лет назад
Скопировал, все работает. Спасибо. Но всеже не понял я в чем причина ведь уменя всегда работало когда я так подключался как описывал выше ....
67 сообщений
#17 лет назад
Наверное это мне надо сходить отдохнуть а то сутра с delphi не вылазию все хочу изучить его )))
67 сообщений
#17 лет назад
Не прдскажите почему вот в этом коде выскакивает (ошибка синтаксиса FROM) и останавливает курсор на той строчке там где я поставл много звездочек (***)procedure TForm2.Button1Click(Sender: TObject);
var
login,login2,pass,id_kod, id_kod2, email : string;
icq : string;
begin
id_kod2 := RandomPassword(20);
login2 := edit1.Text;
pass := edit2.Text;
id_kod := edit3.Text;
email := edit4.Text;
icq := edit5.Text;
comp.ADOQuery1.Close;
comp.ADOQuery1.SQL.Text := 'INSERT INTO (, , , , ) VALUES ("'+ login2 +'","'+ pass +'","'+ id_kod2 +'","'+ email +'","'+icq+'")';
comp.ADOQuery1.ExecSQL;
comp.ADOCommand1.CommandText := 'CREATE TABLE (loginREF TEXT(25), n1 INTEGER, n2 INTEGER, n3 INTEGER, n4 INTEGER, n5 INTEGER, n6 INTEGER)';
comp.ADOCommand1.Execute;
comp.ADOQuery1.Close;
comp.ADOQuery1.SQL.Clear;
comp.ADOQuery1.SQL.Add ('SELECT login FROM registuser WHERE id_key = "'+ id_kod +'"');
comp.ADOQuery1.Open;
login := form2.DBEdit1.Text;
comp.ADOQuery1.Close;
comp.ADOQuery1.SQL.Clear;
comp.ADOQuery1.SQL.Text := 'INSERT INTO SELECT n1,n2,n3,n4,n5,n6 FROM '+ login +'';
comp.ADOQuery1.ExecSQL;
comp.ADOQuery1.Close; ***********************************************************
comp.ADOQuery1.SQL.Clear;
comp.ADOQuery1.SQL.Text := 'UPDATE SET loginREF="'+login+'" ';
comp.ADOQuery1.ExecSQL;
comp.ADOQuery1.SQL.Clear;
form2.Close;
вроде все нормально написал .. или я чегото не замечаю ??
1895 сообщений
#17 лет назад
Никакой ошибка я тут не вижу, код проверил все гуд, вот как у меня получилось:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, Mask, DBCtrls;
type
TForm2 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Button1: TButton;
ADOQuery1: TADOQuery;
ADOCommand1: TADOCommand;
DBEdit1: TDBEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
login,login2,pass,id_kod, id_kod2, email : string;
icq : string;
begin
//id_kod2 := RandomPassword(20);
login2 := edit1.Text;
pass := edit2.Text;
id_kod := edit3.Text;
email := edit4.Text;
icq := edit5.Text;
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'INSERT INTO (, , , , ) VALUES ("'+ login2 +'","'+ pass +'","'+ id_kod2 +'","'+ email +'","'+icq+'")';
ADOQuery1.ExecSQL;
ADOCommand1.CommandText := 'CREATE TABLE (loginREF TEXT(25), n1 INTEGER, n2 INTEGER, n3 INTEGER, n4 INTEGER, n5 INTEGER, n6 INTEGER)';
ADOCommand1.Execute;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add ('SELECT login FROM registuser WHERE id_key = "'+ id_kod +'"');
ADOQuery1.Open;
login := form2.DBEdit1.Text;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := 'INSERT INTO SELECT n1,n2,n3,n4,n5,n6 FROM '+ login +'';
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := 'UPDATE SET loginREF="'+login+'" ';
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
form2.Close;
end;
end.
object Form2: TForm2
Left = 192
Top = 107
Width = 870
Height = 640
Caption = 'Form2'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style =
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Edit1: TEdit
Left = 96
Top = 24
Width = 121
Height = 21
TabOrder = 0
Text = 'Edit1'
end
object Edit2: TEdit
Left = 128
Top = 72
Width = 121
Height = 21
TabOrder = 1
Text = 'Edit2'
end
object Edit3: TEdit
Left = 144
Top = 144
Width = 121
Height = 21
TabOrder = 2
Text = 'Edit3'
end
object Edit4: TEdit
Left = 152
Top = 232
Width = 121
Height = 21
TabOrder = 3
Text = 'Edit4'
end
object Edit5: TEdit
Left = 136
Top = 304
Width = 121
Height = 21
TabOrder = 4
Text = 'Edit5'
end
object Button1: TButton
Left = 368
Top = 96
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 5
OnClick = Button1Click
end
object DBEdit1: TDBEdit
Left = 528
Top = 16
Width = 121
Height = 21
TabOrder = 6
end
object ADOQuery1: TADOQuery
Parameters = <>
Left = 320
Top = 16
end
object ADOCommand1: TADOCommand
Parameters = <>
Left = 416
Top = 24
end
end
Позвольте дать Вам несколько советов:
1. Забудьте про Access, это не СУБД, это пародия на СУБД (рекомендую MSSQL 2000/2005)
2. после того как виполните п.1 забудьте об ADO, технология хотя и общая, но если глубже копнуть то достаточно не продуманная и медленная (рекомендую AnyDAC, я был официалььним тестером компании разработчика и неоднократно убеждалса что она сейчас лучшая в плане скорости/надежности/удобности, также сам пишу уже неа них давно, также прошу не просить у меня платную версию, я ее не стану Вам давать, а стоит она 399 у.е., это компоненти аналог ADO, но намного лучше)
3. забудьте про прямие запроси в программе, это дурацкий тон программирования навеянный движением PHP + MySQL и примитивними учебними материалами, я могу хоть весь день трендеть про плюси хранимых процедур, основние из них (скорость выполнения, чёткая логика, высокая безопасность обеспечивается самим СУБД, уменьшение обемов трафика клиент-СУБД)
4. используйте безопасние конструкции язика, try-except, также крайне рекомендую MSSQL 2005, поскольку данная конструкция в нем тоже реализованная (чего лично я ждал от MSSQL 2000 больше всего)
5. придерживайтесь работе с СУБД в стандарте SQL-92 (напр нету символа ";" в конце каждого запроса!, что лично я считаю тоже дурным тонном работы).
6. Не занимайтесь избитком переменных (напр. у Вас переменние email и icq избиточние)!
7. Приучите себя сразу норм. називать компоненты (напр. не мнемоническое Edit5, а Edit_ICQ или ICQEdit, хотя лично я предпочитаю EditICQ)
8. Откройте для себя конструкцию With, напр так перепишу:
with Comp.ADOQuery1 do
begin
Close;
SQL.Text := 'INSERT INTO (, , , , ) VALUES ("'+ login2 +'","'+ pass +'","'+ id_kod2 +'","'+ email +'","'+icq+'")';
ExecSQL;
end;
9. Ещё раз забудьте об прямых визовах SQL навеки!!!
П.С.
comp.ADOQuery1.SQL.Text := 'UPDATE SET loginREF="'+login+'" ';
а где тут where id= ???)
1895 сообщений
#17 лет назад
Забил добавить, юзайте 2007 делфи, он удобнее и комфортные, правда справка никакая, хотя она нужна совсем непонятно кому, когда интернет под рукой, то практически любая проблема решаемая, а шаблонные ответы справки много пользи не дают.
67 сообщений
#17 лет назад
Цитата:а где тут where id= ???)
А в этих таблицах всего одна запись поэтому не нашел надобности использовать id.
Огромнейшее вам спасибо за ваши советы

Access использую в учебных целях )