Tagi na forum.

Windows 14205 SQL Server 2132
sieci 6796 Windows XP 1921
SQL 6578 Outlook 1838
SBS 3868 Uprawnienia 1777
Windows 2003 2781 IIS 1636
Windows Server 2588 Office 1516
DNS 2315 Skrypt 1499

pokaż wszystkie tagi na forum

DELPHI+MSSQL Jak wpisać do bazy wartości zmiennych

varlock 2009-05-31 20:10:53
0
avatar
 
 
Nie wiem czy to dobre miejsce na zadanie tego pytania, ale już nie wiem gdzie szukać odpowiedzi. Stawiam pierwsze kroki z aplikacjami bazodanowymi. korzystam ze środowiska Turbo Delphi oraz SQLExpress 2008. W Delphi potrafię się połączyć z bazą i wykonywać różne operacje. Problem polega na tym, że nie wiem jak wpisać do bazy wartość zmiennej.

Polecenie SQL w ADOCommand wygląda tak:

INSERT INTO Osoby
(Nazwisko, Imie) VALUES
('Kiepski','Ferdek')

I to działa. Teraz chciałbym w tym poleceniu użyć nie słów "Kiepski" i "Ferdek", tylko wpisać do bazy wartości zmiennych, które zadeklarowałem. Jak to zrobić, bo nie mogę dojść jak w składnię SQL wpisać zmienne? Kombinowałem z używając cudzysłów i apostrof w różnych wariantach, ale coś mi się zdaje, że nie o to chodzi. To moje zmienne:

Nazwisko := 'Kiepski';
Imie := 'Ferdek';


I te zmienne chcę użyć w komendzie SQL. Jak powinna wyglądać składnia polecenia SQL? Żeby bardziej zobrazować o co mi chodzi, to w php robi się np. tak:

INSERT INTO Osoby
(Nazwisko, Imie) VALUES
($nazwisko,$imie)

Nie wiem jak powinno wyglądać odwołanie do zmiennej w komendzie SQL w środowisku DELPHI...
tagi: delphi   PHP   SQL


prachwal  2009-05-31 20:18:54 #1
0
avatar
 
 
tu jest przykład http://www.ibprovider.com/eng/documentation/firebird_interbase_delphi.html

ponadto stawiam na to że parametry zaczynają się od znaku @, tak jest w innych środowiskach które odwołują się do MSSQL-a i w samym MSSQL-u


vbamania.blogspot.com

Edytowano 1 raz. Ostatnio 2009-05-31 20:20:22 przez prachwal.
varlock  2009-05-31 22:14:00 #1.1
0
avatar
 
 
W tym przykładzie są zastosowane dwukropki. Czyli tak jak w książce, którą mam. Autor książki "Delphi 7 i bazy danych" niestety pominął ten istotny fakt...

Więc dwukropki też nie działają. Tzn. dopisuje mi rekord do bazy, ale kolumny w tabeli mają NULL. To jest mój prymitywny program:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOCommand1: TADOCommand;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Nazw, Im : string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Nazw := 'Kiepski';
Im := 'Ferdek';
ADOCommand1.Execute;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ADOCOnnection1.Connected := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ADOConnection1.Connected := False;
end;

end.

A to jest składnia SQL dopisująca rekord:

INSERT INTO Tosoby
(nazwisko, imie) VALUES
(:Nazw, :Im)

Po uruchomieniu programu mam nowy rekord w bazie, ale nie zawiera żadnych danych tylko jest pusty. Gdzie popełniam błąd?

prachwal  2009-05-31 22:21:03 #1.1.1
0
avatar
 
 
a jak dodajesz parametry do kolekcji?
z tego co widzę podstawiasz do zmiennych stringi i odrazu robisz execut-a
vbamania.blogspot.com

knawrot  2009-05-31 23:22:20 #2
0
avatar
 
 
Jeśli chodzi o parametry, to masz dwie mozliwosci:

Delphi automatycznie tworzy liste parametrow, po przypisaniu CommnandTextu, ale trzeba mu powiedziec, jakie dane chcesz miec w tych parametrach. Wyglada to tak:


ADOCommand1.CommandText:='INSERT INTO osoby (nazwisko, imie) VALUES (:Nazw, :Im)';
ADOCommand1.Parameters[0].value:='Kowalski';
ADOCommand1.Parameters[1].value:='Jan';
ADOCommand1.Execute;


Jesli natomiast nie chcesz pamietac, w jakiej kolejnosci wpisales parametry, to robisz tak:

ADOCommand1.CommandText:='INSERT INTO osoby (nazwisko, imie) VALUES (:Nazw, :Im)';
ADOCommand1.Parameters.ParamByName('Nazw').value:='Kowalski';
ADOCommand1.Parameters.ParamByName('Im').value:='Jan';
ADOCommand1.Execute;


A poza tym, to polecam komponet ADODataSet - manipulacja danymi, za jego pomoca jest duzo prostsza:

ADODataSet1.commandtext:='select * from osoby';
ADODataSet1.open;
ADODataSet1.append; //.edit
ADODataSet1.fieldbyname('imie').value:='Jan';
ADODataSet1.fieldbyname('Nazwisko').value:='Kowalski';
ADODataSet1.Post; //.cancel



-----
Co się stanie, gdy siła, której nic nie może powstrzymać, uderzy w obiekt, którego nic nie może ruszyć?

Edytowano 1 raz. Ostatnio 2009-05-31 23:23:43 przez knawrot.
----- Co się stanie, gdy siła, której nic nie może powstrzymać, uderzy w obiekt, którego nic nie może ruszyć?
varlock  2009-06-01 18:02:01 #2.1
0
avatar
 
 
OK. Rozumiem to, co napisałeś. Chyba rozumiem :-).
Tylko właśnie nie chcę wpisywać danych w kod, a pobierać je np. z formularza. Czyli daję jakiś formularz, użytkownik wprowadza do niego dane, np. nazwisko, klika buttona i te dane wpisują się do bazy. Dane podstawiam do zmiennych i tymi zmiennymi operuję później w SQL. W Twoim przykładzie operuję nazwami zmiennych w SQL, ale i tak musiałbym w kodzie programu wpisać wartości zmiennych (value:='xxx' - to chcę zastąpić zmienną, która zawiera dane np. TEdit).

varlock  2009-06-01 18:43:10 #2.2
0
avatar
 
 
Zrobiłem tak:

procedure TForm1.Button1Click(Sender: TObject);
begin
Nazw := 'Kiepski';
Im := 'Ferdek';
ADOCommand1.Parameters[0].value:=Nazw;
ADOCommand1.Parameters[1].value:=Im;
ADOCommand1.Execute;
end;

I teraz działa! Czyli rozumiem, że w samym poleceniu SQL posługuję się nazwami zmiennych, ale za każdym razem przy stosowaniu ADOCommand muszę podać parametry i przypisać im nazwy zmiennych. Tak wynika z powyższego przykładu. Dobrze rozumiem czy źle?

prachwal  2009-06-01 19:00:47 #2.2.1
0
avatar
 
 
w poleceniu SQL znaki zapytania też powinien zrozumieć
jeżeli chodzi o parametry to albo podajesz po nazwie albo po numerze w kolekcji
w przykładzie co podałeś jest to akurat druga możliwość
vbamania.blogspot.com

knawrot  2009-06-01 20:38:13 #2.2.2
0
avatar
 
 
I teraz działa! Czyli rozumiem, że w samym poleceniu SQL posługuję się nazwami zmiennych, ale za każdym razem przy stosowaniu ADOCommand muszę podać parametry i przypisać im nazwy zmiennych. Tak wynika z powyższego przykładu. Dobrze rozumiem czy źle?
Chyba rozumiesz, ale mylisz nieco pojecia.

Aby wykonac polecenie SQL NIE musisz uzywac parametrow.
Tzn teoretycznie mozesz zrobic tak:


ADOCommand1.CommandText:='INSERT INTO osoby (nazwisko, imie) VALUES ('''+Nazw+''', '''+Im+''')';
ADOCommand1.Execute;

Tu nie ma parametrow, a i tak przesylasz zawartosc zmiennych.

Parametry uzywasz ze wzgledu na wygode i BEZPIECZENSTWO.

Zwroc uwage, ze nazwy parametrow nie maja absolutnie nic wspolnego z nazwami zmiennych, jakie do nich przypisujesz.

Mozesz zrobic np. tak:

ADOCommand1.CommandText:='INSERT INTO osoby (nazwisko, imie) VALUES (:nazwa1, :nazwa2)';
ADOCommand1.Parameters[0].value:=form1.edit1.text;
ADOCommand1.Parameters[1].value:=form2.edit2.text;
ADOCommand1.Execute;


Poza tym parametry definiujesz tylko raz, a pozniej mozesz je uzywac wiele razy.

Mozesz zrobic cos takiego:


procedure TForm1.Add(imie,nazwisko:string);
begin
ADOCommand1.Parameters[0].value:=Nazwisko
ADOCommand1.Parameters[1].value:=Imie;
ADOCommand1.Execute;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOCommand1.CommandText:='INSERT INTO osoby (nazwisko, imie) VALUES (:Nazw, :Im)';
Add('Jan','Kowalski');
Add('Anna','Kowalska');
end;

-----
Co się stanie, gdy siła, której nic nie może powstrzymać, uderzy w obiekt, którego nic nie może ruszyć?

----- Co się stanie, gdy siła, której nic nie może powstrzymać, uderzy w obiekt, którego nic nie może ruszyć?
varlock  2009-06-01 20:50:32 #2.2.2.1
0
avatar
 
 
Teraz wszystko rozumiem. Zgadzam się w 100% z tą "wygodą i bezpieczeństwem". BARDZO dziękuję za pomoc. Nie rozumiałem podstawowej sprawy. Niestety w książce, którą kupiłem jest to pominięte, a powinno być opisane. Jakby nie było jest to podstawowa sprawa. Jeszcze raz dziękuję i pozdrawiam.

Udziel odpowiedzi

avatar
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.

Idź na górę strony