Zakładanie bazy na serwerze z aplikacji w delphi

0

Jak założyć baze danych (z tabelami i referencjami) na serwerze MSSQL 2000 z aplikacji napisanej w delphi? Program ma sprawdzać czy dana baza istnieje na serwerze a jak nie to ma ją utworzyć.
Proszę o pomoc

0

normalnie - zalogować się na serwer, sprawdzić (to sobie sam znajdź bo nie wiem jak jest w mssql) i jak nie ma to zapytaniami SQL (typu CREATE DATABASE, CREATE TABLE itd) stworzyć strukturę/ Musisz tylko pamiętać, że musisz się zalogować na usera, który ma uprawnienia do tworzenia baz i tabel

0

W jaki sposób zrobić to zapytaniami??
Za pomocą ADOQuery się nie da.
Proszę o jakiś przykład jak ktoś wie

0

Witam !

Mozna, tylko jest to bardzo pracochłonne. Musisz wygenerować całą strukturę bazy danych a więc jesteś w posiadaniu skryptu będącego zbiorem poleceń SQL-a, który to wykona. Ponieważ ADO nie obsłuży (wykona) skryptu musisz wykonać wszystkie polecenia w nim zawarte "na piechotę", jeden po drugim pamiętając o kolejności.
Nie możesz np. zakładać indeksu czy referencji do tabeli, która jeszcze nie istnieje
itp... Jest to uciążliwe ale możliwe. Najlepiej próbować wyszukać jakiś komponencik do wykonywania skryptów współpracujący z interesującą Cię bazą i go zastosować.

Pozdrawiam

0
jw_software napisał(a)

Mozna, tylko jest to bardzo pracochłonne. Musisz wygenerować całą strukturę bazy danych a więc jesteś w posiadaniu skryptu będącego zbiorem poleceń SQL-a, który to wykona.

A bez użycia delphi tylko z pod programu zarządzającego to się sama struktura wpisze :>
a poza tym, jeśli baza już istnieje to, większość normalnych programów do obsługi samego SZBD ma możliwość wyeksportowania całej struktury bazy do pliku txtowego

Ponieważ ADO nie obsłuży (wykona) skryptu musisz wykonać wszystkie polecenia w nim zawarte "na piechotę", jeden po drugim pamiętając o kolejności.

TADOCommand - a jak nie obsługuje kilku zapytań to wystarczy napisać automat, który będzie wczytywał z pliku txt polecenia od pierwszego znaku do ; a potem znowu od następnego do ; (tak są oznaczane końce pojedyńczego zapytania SQL) i je wykonywał

Nie możesz np. zakładać indeksu czy referencji do tabeli, która jeszcze nie istnieje

to chyba normalne i nigdzie się tak nie da

itp... Jest to uciążliwe ale możliwe. Najlepiej próbować wyszukać jakiś komponencik do wykonywania skryptów współpracujący z interesującą Cię bazą i go zastosować.

ale wtedy (idąc Twoim tokiem myślenia) skrypt też trzeba napisać ręcznie :>

0

Nie wiem czy zauważyłeś ale problem jes w utworzeniu bazy danych Z POZIOMU APLIKACJI NAPISANEJ W DELPHI A NIE ŻADNEJ INNEJ ZEWNĘTRZNEJ. Oczywiście, że z poziomu jakiegoś programu do zarządzania bazą, bazami danych można wygenerować odpowiedni skrypt co jest bardzo porządane gdyż ustrzeżemy się wielu błędów, ale samo jego wykonanie z poziomu aplikacji użytkownika to już inna sprawa. Tutaj albo dołączymy do konkretnego projektu jakiś komponent do wykonywania skryptów albo tak jak pisałem niestety wykonujemy go "na piechotę" czyli tak jak to określiłeś programujemy automat, który zrobi to za nas. Oczywiście, że żaden szanujący się serwer baz danych nie pozwili na założenie np. ograniczeń na tabeli, która nie istniej ("nie odkryłeś Ameryki") ale wydaje mi się, iż wcześniejsze przemyślenie kolejności wykonywanych zapytań (jeśli skrypt tworzymy ręcznie) jest konieczne gdyż w takim wypadku wystarczy jedno wykonanie i baza gotowa. W przeciwnym przypadku mamy do czynienia z programowaniem metodą prób i błędów, która zabiera czas, niszczy nerwy i czyni naszą aplikację podatną na błędy. Tak programuje ktoś kto tego robić nie powinien.

0

A w jaki sposób sprawdzić z poziomu aplikacji delphi czy dana baza intniej na serwerze MSSQL 2000? Może ktoś wie jak utworzyć taki automat który wczyta z pliku txt polecenia sql i je wykona na serwerze. Prosze o przykład kodu.

0
jw_software napisał(a)

Nie wiem czy zauważyłeś ale problem jes w utworzeniu bazy danych Z POZIOMU APLIKACJI NAPISANEJ W DELPHI A NIE ŻADNEJ INNEJ ZEWNĘTRZNEJ. Oczywiście, że z poziomu jakiegoś programu do zarządzania bazą, bazami danych można wygenerować odpowiedni skrypt co jest bardzo porządane gdyż ustrzeżemy się wielu błędów, ale samo jego wykonanie z poziomu aplikacji użytkownika to już inna sprawa. Tutaj albo dołączymy do konkretnego projektu jakiś komponent do wykonywania skryptów albo tak jak pisałem niestety wykonujemy go "na piechotę" czyli tak jak to określiłeś programujemy automat, który zrobi to za nas. Oczywiście, że żaden szanujący się serwer baz danych nie pozwili na założenie np. ograniczeń na tabeli, która nie istniej ("nie odkryłeś Ameryki") ale wydaje mi się, iż wcześniejsze przemyślenie kolejności wykonywanych zapytań (jeśli skrypt tworzymy ręcznie) jest konieczne gdyż w takim wypadku wystarczy jedno wykonanie i baza gotowa.

umiesz czytać ze zrozumieniem? To, że ty masz z tym problem nie znaczy, że jest to jakieś skomplikowane!

TADOCommand - a jak nie obsługuje kilku zapytań to wystarczy napisać automat, który będzie wczytywał z pliku txt polecenia od pierwszego znaku do ; a potem znowu od następnego do ; (tak są oznaczane końce pojedyńczego zapytania SQL) i je wykonywał

widzisz tu gdzieś problem? Pod czym byś tego nie robił (Delphi, program do zarządzania konkretnym SZDB, coś jeszcze innego) to i tak i tak trzeba te CREATE TABLE i całą resztę napisać!
Wystarczy trochę pomyśleć i napisać kilka linijek WŁASNEGO kodu a nie do wszystkiego ściągać komponenty!
BTW nie wiem jak ty, ale ludzie, których znam (i nzajmują się BD) potrafią, mając przed sobą schemat BD, napisać od ręki skrypt tworzący daną bazę. No chyba, że masz zamiar pisać skrypt nie wiedząc jakie tabele, pola, indexy, ograniczenia itd ma mieć :>

W przeciwnym przypadku mamy do czynienia z programowaniem metodą prób i błędów, która zabiera czas, niszczy nerwy i czyni naszą aplikację podatną na błędy. Tak programuje ktoś kto tego robić nie powinien.

rozumiem, że jesteś tak genialny, że wszystkiego uczysz się od razu i nigdy żadne błędy ci nie wyskakują.

minio napisał(a)

A w jaki sposób sprawdzić z poziomu aplikacji delphi czy dana baza intniej na serwerze MSSQL 2000?

tu masz jeden sposób
drugi to zrobić CREATE DATABASE i jak wywali błąd to znaczy, że jest
trzecia to (nie wiem czy mssql ma coś takiego, ale powinien) sprawdzić w tabelach systemowych czy dana baza istnieje (gdzieś muszą być zapisane w końcu info o bazach, tabelach itd)

Może ktoś wie jak utworzyć taki automat który wczyta z pliku txt polecenia sql i je wykona na serwerze. Prosze o przykład kodu.

no toż to jest parę linijek kodu. Otwarcie pliku textowego, wczytanie lini do znaku; wykonanie polecenia, wczytanie następnego i tak aż do końca pliku.

0

GRATULUJĘ GENIUSZU !!!

0

Dzięki za poomoc Misiekd. Teraz już wiem jak sprawdzić czy baza istnieje na serwerze. Pozostaje mi tylko pomęczyć się z założeniem bazy na serwerze z poziomu aplikacj.

0
minio napisał(a)

W jaki sposób zrobić to zapytaniami??
Za pomocą ADOQuery się nie da.

Co się nie da?
A z pół obrotu chcesz? ;)

A męczenia z założeniem bazy nie ma żadnego. Jedyne, co musisz zrobić, to skonstruować zapytanie SQL

var
  ado: TAdoQuery;
begin
  ado:=TAdoQuery.Create(Application);
  ado.Connection:=MainConnection; //MainConnection to oczywiście połączenie
  ado.SQL.Text:=myQuery; //zapytanie tworzące bazę
  try  
    Ado.ExecSQL;
  except
    on E: Exception do showMessage('Błąd: '+e.message);
  end;
  ado.Free;
end;

I masz pełną dynamikę począwszy od utworzenia ADO.

Pamiętaj, że ADOQuery jest tak skonstruowane, że jeśli pobierasz coś z bazy(SELECT) to wtedy używasz metody Open(ewentualnie Active:=true). We wszystkich innych wypadkach używasz ExecSQL.

0

w połączeniu (łańcuchu połączenia) mam zdefiniowana z którą bazą się łącze. Jeżeli bazy tej nie będzie na serwerze to nie nawiąże połączenia i nie założe nowej bazy. Co z tym zrobić??

0

Witam,

Bawie sie aktualnie z baza danych i mam maly problem.
Mam juz gotowa baze i stworzylem skrypt do jej tworzenia, skrypt chodzi bez problemu w Query MSSQL'a, niestety tylko tam :(
Kiedy wladuje to do ADOQuery albo ADOCommand to juz jest klapa.

najpierw byl problem z poleceniem 'GO' ale wyrzucilem to i bylo ok ale nastepnie sie zawiesilo na
CREATE TABLE... i nie mam pojecia jak go zmusic do dzialania :/

tak wyglada polecenie sql:

CREATE TABLE [dbo].[CLogin] (
	[CID] [int] NOT NULL ,
	[Type] [tinyint] NOT NULL ,
	[ExpTime] [int] NOT NULL 
) ON [PRIMARY]

a tak wyglada polecenie wykonania:

var
 s:TStrings;
begin
s:=TStringList.Create;
try
s.LoadFromFile('c:\komenda.sql');
dbchange(ADOConnection,'ka'); //ustawia odpowiednia baze
ADOCommand1.CommandText:=s.Text;
ADOCommand1.Execute;
except
showmessage('BLAD');
end;
end;

dlaczego to go*** nie chce mi wykonac polecenia CREATE TABLE?

0

vir2000 ->

nie używaj adocommand

  ADOQuery1.SQL.Text:=s.Text;
  ADOQuery1.ExecSQL;

jeszcze pytanie. czy użytkownik którego używasz do połączenia ma uprawnienia roli dbo? Może zmodyfikuj trochę ten kod sql'a?


CREATE TABLE CLogin (
        CID int NOT NULL primary key,
        Type tinyint NOT NULL ,
        ExpTime int NOT NULL 
)

minio ->

w delphio dwa razy kliknij na komponent ADOConnection -> wybierz serwer -> wpisz nazwę użytkownika i hasło (user musi mieć uprawnienia do zakładania baz danych) -> wyczyść wszystkie pola związane z bazą -> daj test connection -> bez wskazanej bazy powinien się bezproblemowo połączyć (podejrzewam że tu problem z userem, spróbuj połączyć się jako SA) -> następnie utwórz komponent ADOQuery1 i na jakąś akcję (na przykład wciśnięcie przycisku) daj taki kod:

ADOQuery1.SQL.Text := 'create database jmail';
ADOQuery1.ExecSQL;

i utworzy ci bazę jmail. podejrzewam że problem Twój leży w użytkoniku. ;)

0

uzylem ADOCommand z 2 powodow:

  1. dziala tak samo jak ADOQuery
  2. wymaga 2 linijek nie 4 :P

tak mam dostep jako admin wiec wszytko powinno byc ok, problem rozwiazalem :)
Kruczyk tkwil w tym ze ADO nie obsluguje kwadratowych nawiasow...
kiedy przerobilem kod na:

CREATE TABLE CLogin (
	CID int NOT NULL ,
	Type tinyint NOT NULL CONSTRAINT DF_CLogin_Type DEFAULT (0),
	ExpTime int NOT NULL CONSTRAINT DF_CLogin_ExpTime DEFAULT (0),
	CONSTRAINT PK_CLogin PRIMARY KEY  CLUSTERED (CID))

to juz nie mialem zadnych bledow :)

teraz sie mecze jak przy pomocy ADO wladowac Job'y...

---EDIT---

Dla wszystkich zainteresowanych, poradzilem sobie rowniez z dodawaniem job'a (problem tkwil w deklaracjach zmiennych)
Jesli kod do sqla przewiduje funkcje DECLARE... musicie ta zmienna dodac do komponentu (w moim wypadku bylo to ADOCommand) w Parameters. Nie wiem jak ale mi zadzialalo :D

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