Problem z pobieraniem danych z bazy danych

0

Witajcie, mam następujący problem. Piszę prosty program do obsługi bazy danych i od samego problemu mam problemy.

O to błąd który dostaje:

user image

A o to kod:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBXpress, FMTBcd, StdCtrls, DB, SqlExpr, DCPmd5;

type
  TForm1 = class(TForm)
    SQLConnection1: TSQLConnection;
    SQLDataSet1: TSQLDataSet;
    Button1: TButton;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
  Connected : Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
// Poczatek funkcji hashujacej string na md5
function MD5(const S: String): String;
var
  i: Byte;
  digest: array[0..15] of Byte;
begin

  with TDCP_md5.Create(nil) do
  begin
    Init;
    Update(S[1], Length(S));
    Final(digest);
    Free;
  end;

  Result := '';
  for i := 0 to Length(digest)-1 do
    Result := Result + IntToHex(digest[i], 2);
  Result := LowerCase(Result);
end;
// Koniec funkcji hashuj¹cej string na md5

procedure TForm1.Button1Click(Sender: TObject);
var
  login:string[20];
  haslo:string[32];
  mysqlpassword:string[32];

begin
  login:=Edit1.Text;
  haslo:=Edit2.Text;
  if Connected then Connected := False else Connected := True;
  SQLConnection1.Connected := Connected;
  SQLDataSet1.CommandText := 'SELECT id, haslo FROM users WHERE login="'+Edit1.Text+'"'; // zapytanie
  // jak zamiast login dasz id to wszystko dziala
  SQLDataSet1.Open; // odczytaj dane
  Label3.Caption:=SQLDataSet1.FieldValues['haslo'].AsString;
  SQLDataSet1.Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SQLConnection1.Connected := False;
end;

end. 

Błąd występuję po wciśnięciu Buttona1 w następującej linii:

SQLDataSet1.CommandText := 'SELECT id, haslo FROM users WHERE login="'+Edit1.Text+'"'; // zapytanie 

Gdy zamiast warunku login dam id, analogicznie zmieniając warunek z Edit1.Text na dowolną liczbę id wiersza znajdującego się w bazie to problem nie występuję.

Pozdrawiam,

Mateusz

dodanie znaczników <code class="delphi"> - fp

0

Może SQLDataSet1.CommandText := 'SELECT id, haslo, login FROM users WHERE login="'+Edit1.Text+'"'; // zapytanie lub upewnij się czy dany login istnieje lub czy kolumna login jest prawidłowa.

0

http://mateuszmarzecki.pl/download/upewnienie.jpg

w ramach uświadomienia Cie, że wszystko jest w porządku.

0

Jeśli nie wiesz, jak skorzystać z debuggera, to zrób sobie zmienną tekstową i przypisz do niej 'SELECT id, haslo FROM users WHERE login="'+Edit1.Text+'"', a potem wyświetl to na ekranie i zobacz co jest nie tak (ewentualnie skopiuj i sprawdź czy się wykonuje w bazie). Jeśli wiesz, to ... skorzystaj :)

0

a to się wykonuje SQLDataSet1.CommandText := 'SELECT id, haslo, login FROM users WHERE login="Mateusz"; '; // zapytanie ?

0

Osobo niezalogowana Twój sposób nie pomógł. Debugger też nie.

szopenfx napisał(a):

a to się wykonuje SQLDataSet1.CommandText := 'SELECT id, haslo, login FROM users WHERE login="Mateusz"; '; // zapytanie ?

to też nie.

Jakieś inne propozycje?

0

a moze zamiast jawnego tekstu zapytanie z parametrem?

0
crowa napisał(a):

a moze zamiast jawnego tekstu zapytanie z parametrem?

Mów dalej.

0

spróbuj tak: QLDataSet1.CommandText := 'SELECT id, haslo FROM users WHERE login=+Edit1.Text+; // zapytanie

0

w zaleznosci od tego z jakich komponentow korzystasz (ja np unidac) moze to wygladac tak

 
var
  Query: TUniQuery;
begin
  Query := TUniQuery.Create(Self);
  try
    Query.SQL.Add('select * from Tabela t where t.Id = :Id');
    Query.ParamByName('Id').Value := 10;
    Query.Connection := UniConnection1;
    Query.Open;
  finally
    FreeAndNil(Query)
  end;
end 
0

nie mogę znaleźć nic na ten temat w dbexpress.

usunięcie cytowania całego poprzedniego posta - fp

0
Lithaos napisał(a):

procedure TForm1.Button1Click(Sender: TObject);
var
login:string[20];
haslo:string[32];
mysqlpassword:string[32];

begin
login:=Edit1.Text;
haslo:=Edit2.Text;
if Connected then Connected := False else Connected := True;
SQLConnection1.Connected := Connected;
SQLDataSet1.CommandText := 'SELECT id, haslo FROM users WHERE login="'+Edit1.Text+'"'; // zapytanie
// jak zamiast login dasz id to wszystko dziala
SQLDataSet1.Open; // odczytaj dane
Label3.Caption:=SQLDataSet1.FieldValues['haslo'].AsString;
SQLDataSet1.Close;
end;

end.

> 
> Błąd występuję po wciśnięciu Buttona1 w następującej linii: 
> 
> 
```delphi
SQLDataSet1.CommandText := 'SELECT id, haslo FROM users WHERE login="'+Edit1.Text+'"'; // zapytanie 

Spróbuj tego

var
  zapytanie:String;
begin
zapytanie:='';
zapytanie:='SELECT id, haslo, login FROM users WHERE login='+chr(39)+Edit1.Text+chr(39); // zapytanie
SqlDataSet1.CommandText:='';
Memo1.Text:=zapytanie;
SQLDataSet1.CommandText := zapytanie;
....

Oczywiście wcześniej wrzuć na formę Memo :-)

0

To powyżej powinno pomóc, bo autor zauważył chyba to samo, co ja. Czyli APOSTROF (') powinien być zamiast cudzysłowy ("). Najlepiej takie zapytania tworzyć z parametrami, jak było wcześniej napisane albo za pomocą format:

  sql = format('SELECT id, haslo, login FROM users WHERE login = ''%s''', [edit1.Text]);

zauważ, że w powyższym kodzie nie ma żadnego cudzysłowy, tylko same apostrofy.

0

Analfabeci nauczcie się czytać...
Błąd ma bo program chce przypisać coś co nie istnieje (null) do String'u.
Zanim zaczniesz operować na takich danych z bazy przydało by się byś sprawdził ile wyników zostało pobranych bo jak 0 to naturalne że będzie wywalał błędy.
A teraz odpowiedź dlaczego wywala ci debugger na zapytaniu - kody przypisanie jest poprawny ale błąd powstał przy zapytaniu, które zwróciło 0 wyników a ty 100% spodziewasz się co najmniej jednego wyniku.

0

analfabeto przeczytaj jeszcze raz temat - autor ma problem z poprawnym wywołaniem zapytania a nie z obsługą błędów, które są dopiero następstwem zwrócenia 0 wyników. Pisząc w skrócie nawet jeśli se zrobi tą obsługę błędów to od tego magicznie zapytanie nie zacznie zwracać > 0 rekordów ze złego zapytania.

0

Gdy zamiast warunku login dam id, analogicznie zmieniając warunek z Edit1.Text na dowolną liczbę id wiersza znajdującego się w bazie to problem nie występuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1