Андрей Зайцев
67 сообщений
#17 лет назад
Вытягиваю эти компоненты на форму настраиваю ADOConnection далее в компоненте ADOQuery в свойстве DATADource выбираю DataSource1 в свойстве connection выбираю ADOConnection1 а вот в компоненте DataSource1 в свойстве DataSet ниче не выбирается.. Почему ?? У кого была такая проблема ??
Недавно все работало писал прогу и вдруг начались эти партаки .. думал может че в коде намудрил, перезапускаю делфи создаю новый проект вытаскиваю эти компоненты и пытаюсь их связать но ниче не получается.. Что за чудо глюк ??? (делаю я это в delphi 7)
Андрей Зайцев
67 сообщений
#17 лет назад
Работаю я с Access 2003
Николай М.
1895 сообщений
#17 лет назад
Ваш код в студию (filebeam.com - отличный обменник), посмотрим, скорее всего это баг среди а не самой делфи.
Андрей Зайцев
67 сообщений
#17 лет назад
Блин, я перезагрузил комп создал новуб БД в акцесе с одной табличкой создал новый проект в делфи и все таже фигня не могу соеденить эти компоненты... у меня еще никогда не было такого глюка
Андрей Зайцев
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 лет назад
А теперь и так все работать стало как я раньше делал
Андрей Зайцев
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 использую в учебных целях )
Владимир С.
581 сообщение
#17 лет назад