Dynamiczne Tworzenie bazy MySQL w dbExpress

0

Witam

Mam pytanie a właściwie prośbę o wytłumaczenie jak albo jakiegoś linka który "mówi" jak
w kodzie Delphi o ile się da zrobić następujące operacje na Serwerze MySQL:

  1. Zmienić hasło admina;
  2. Założyć bazę z hasłem;

o połączenie i inne operacje nie pytam bo do tego są przykłady,
ale nad tym już trochę kombinuje i normalnie mur.
Delphi 2007 bez dodatków.
Zakładam że jak uruchamiam DBE Administratora i baza jest to znaczy ze wszystko ok ale to moje domysły.

W tej chwili mam taki kod książkowo/ internetowy:

Pozdrawiam

Delphi

unit Unit1;

interface

uses
  // UMyDBDelfin,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WideStrings, FMTBcd, Menus, SqlExpr, DB, DBClient, SimpleDS, ComCtrls,
  DBTables;


const
      // cDirMySQL = 'C:\Documents and Settings\All Users\Dane aplikacji\MySQL\MySQL Server 5.1\data';
      cDirMySQL = 'F:\Programy\WebServ\mysql\data';

type
  TForm1 = class(TForm)
    MySQL: TSQLConnection;
    SQLDataSet: TSQLDataSet;
    SQLQuery1: TSQLQuery;
    MainMenu1: TMainMenu;
    Baza1: TMenuItem;
    BazaCreate1: TMenuItem;
    BazaDestroy1: TMenuItem;
    SimpleDataSet: TSimpleDataSet;
    N1: TMenuItem;
    Disconnet: TMenuItem;
    Connect: TMenuItem;
    StatusBar1: TStatusBar;
    Session: TSession;
    procedure BazaCreate1Click(Sender: TObject);
    procedure ConnectClick(Sender: TObject);
    procedure DisconnetClick(Sender: TObject);
    procedure MySQLLogin(Database: TSQLConnection; LoginParams: TWideStrings);
    procedure MySQLAfterConnect(Sender: TObject);
    procedure MySQLAfterDisconnect(Sender: TObject);
    procedure BazaDestroy1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BazaCreate1Click(Sender: TObject);
begin
  // SQLConnection.Name:= 'MySQLConnection';
  {
  SQLConnection.GetDriverFunc:= 'getSQLDriverMYSQL';

  // SQLConnection.LibraryName:= 'dbxmys.dll';
  SQLConnection.LibraryName:= 'libmySQL.dll';
  SQLConnection.VendorLib:= 'libmySQL.dll';
  }
  // SQLDataSet.SQLConnection:= SQLConnection;

  Session.AutoSessionName:= True;
  if not DirectoryExists( cDirMySQL + '\Delfin' ) then
  begin
    CreateDir( cDirMySQL + '\Delfin'  );
    Session.AddStandardAlias( 'Delfin', cDirMySQL + '\Delfin', '');
  end;

end;

procedure TForm1.BazaDestroy1Click(Sender: TObject);
begin //

end;

procedure TForm1.ConnectClick(Sender: TObject);
begin
  MySQL.DriverName:= 'MySQL';
  MySQL.LoginPrompt:= False;         // nie pojawia sie okienko z zapytaniem o hasło
  MySQL.Connected := True;
end;

procedure TForm1.DisconnetClick(Sender: TObject);
begin
  MySQL.Connected := False;

end;

procedure TForm1.MySQLAfterConnect(Sender: TObject);
begin
  StatusBar1.Panels[0].Text:= 'Connect';
end;

procedure TForm1.MySQLAfterDisconnect(Sender: TObject);
begin
  StatusBar1.Panels[0].Text:= 'DisConnect';
end;

procedure TForm1.MySQLLogin(Database: TSQLConnection;
  LoginParams: TWideStrings);
begin
  LoginParams.Values['User_Name']:= 'root';
  LoginParams.Values['Password']:= '';
  LoginParams.Values['HostName']:= '127.0.0.1';
  LoginParams.Values['Database']:= 'Delfin';
end;

end.
 
0

Jeżeli chodzi o zmianę hasła, to raczej nie szukałeś u wujka google, bo akurat MySQL ma fajną dokumentację, ale niech ci będzie:

wystarczy odpalić zapytanie: UPDATE mysql.user SET password=PASSWORD('<twoje_haslo>') WHERE USER='<twoj_user>'

mozna to jeszcze rozszerzyc o hosta (w sensie w klauzuli WHERE dodac warunek: AND host='<twoj_host_lub_%')


Nie bardzo wiem o co ci chodzi z tym zakłądaniem bazy z hasłem. Bazę po prostu się zakłada, a następnie nadaje uprawnienia userom do niej. To czy user będzie miał hasło, czy nie to osobna sprawa.

zeby utworzyc bazę odpalasz zapytanie:

CREATE DATABASE '<twoja_baza>';

potem musisz się podpiac do bazy:

USE <twoja_baza>;

potem nadajesz updawienia (chyba, ze user ma nadane uprawnienie . to nie trzeba teoretycznie - wystarczy FLUSH PRIVILEGES):

GRANT (lista lub) ALL PRIVILEGES ON <twoja_baza>.* TO '<twoj_user>'@'<host>' IDENTIFIED BY '<twoje_haslo>';

przy czym ... jezeli user nie istnieje - zostanie utworzony z takim hasłem jak podałes;

na koniec, zeby uprawnienia nabrały mocy - odpalasz:

FLUSH PRIVILEGES;

i viola.

0

Sorki może źle się wyraziłem. To by była odpowiedź na pierwsze pytanie.
No tak ale ja się pytam jak utworzyć nieistniejąca bazę to zrobić w Delphi, konkretnie dbExpress;
w mądrej książce piszą, że do istniejącej już bazy trzeba w SQLConnection podać nazwę bazy, login hasło.

A ja chcę utworzyć nieistniejąca bazę a następnie się do niej podłączyć utworzyć użytkownika i na niej dopiero działać; wszystko w kodzie Delphi bez odpalania konsoli. Tylko wybieram localhost albo jakiś adres strony np swojej z zainstalowanym MySQL 5.1 na wykupionym serwerze dedykowanym. ale to chyba na jedno wychodzi.

0

O ratunku !!!

A jak wysyłasz zapytania typu SELECT, INSERT, UPDATE i DELETE to z jakiego komponentu korzystasz. Zakładam, że TQuery

moje zapytania niczym sie nie roznia od zwyklych SELECTow. nie sa magiczne i zarezerwowane dla konsoli (zreszta konsola, czy jakikolwiek program managerowy nie jest niczym nadzwyczajnym i niczym wiecej jak zwyklym klientem - takim samym jak twoj program).

jezeli chcesz utworzyc i podpiac sie do nieistniejacej bazy, to sekwencja dzialan jest taka:

podpinasz sie do istniejacej na pewno bazy 'mysql':

USE mysql;

lub w parametrach polaczenia w propercie Database podajesz nazwę: LoginParams.Values['Database']:= 'mysql';
(zamiast mysql mozesz podpiac sie do bazy information_schema - obojetne, z tym, ze information_schema pojawilo sie w wersjach bodajze od 4.1, albo 5.0 w gore)

tworzysz swoja baze:

CREATE DATABASE '<twoja_baza>';

przelaczasz kontekst na swoja baze:

USE <twoja_baza>

tworzysz usera i nadajesz mu prawa:

GRANT blablabla

FLUSH PRIVILEGES;

i tyle

wszystko z poziomu komponentu TQuery.

Inaczej rzecz ujmujac - wszystko co mozesz zrobic z poziomu konsoli - mozesz rowniez zrobic z poziomu swojego programu. Nie ma tutaj zadnych ograniczen.

Długa droga przed toba kolego.

0

Dzięki. Może długa ... wiem, że się muszę sporo nauczyć

0

Nieptrzebnie napisalem to ostatnie zdanie.

0

Nie, wszystko w porządku, porostu czasami jak ja coś próbuje zdziałać to kombinuję i lubię się zapętlać, a wszystko przez to (podejrzewam) że za bardzo skupiam się na drobiazgach i potem gubię się w całości ... ale to podejrzewam przez brak planowania w programowaniu.
Nie bardzo wiem jak to zmienić, jak się do tego zabrać.. używać jakiegoś programu żeby najpierw zrobić algorytm programu który chce wykonać?

Nie ukrywam że programowanie traktuje jako hobby i właściwie sam się wszystkiego uczę, tu się coś wyczyta, od kogoś fragment kodu się złapie i potem jak próbuje coś zrobić to jest to klejenie różnych zlepków informacji.
Cóż z tego, że potrafię niezłą klasę zmajstrować i wyczyniać różne magiczne rzeczy z danymi, których czasem zaawansowani programiści mówią że "jest trochę roboty" ale jak już po napisaniu kodu, jak już ogarnę kod okazuje się że to by można prościej zrobić, jakieś procedury w ogóle są nie potrzebnie pisane (zmarnowany czas) a w ogóle kod jest tak niezoptymalizowany, że zastanawiam się czy byłem trzeźwy jak program pisałem, chociaż praktycznie jestem abstynent i to kulturalny poniekąd.

W skrócie w jaki sposób wymusić nauczenie się ładu w kodzie programu? bo to będzie walka z latami złych nawyków.

0

No coż. Normalne.

NIe raz miałem sytację, że zaczynałem pisać aplikację nie mając pojęcia gdzie jest koniec, jak on wygląda i jak sie będzie komponowała całość.

Efekt zazwyczaj był/jest taki jak opisałeś.

Ja jednak nie przejmuję się takimi sytuacjami. Dlaczego ? Bo najważniejsze, że uświadamiasz sobie niedoskonałość swojej pracy, widzisz możliwość poprawy i przy następnym podejściu zrobisz to po bozemu i optymalnie.

Inaczej rzecz ujmując - pierwsze podejście do danego tematu, z którym nigdy sie nie mierzyłem traktuje jak poligon doświadczalny. Wyjdzie z tego proteza pisana do protezy, przykrywana protezą i podpierana protezą ? Super - trudno. Zbierzesz te wszystkie protezy do kupki i następnym razem napiszesz optymalny, elegancki kod, który da ci miejsce na elastyczność, będzie prosty i logiczny.

Szczęściem jest, jeżeli jesteś w stanie przewidzieć wszelkie możliwe przypadki i sytuacje, na jakie może się natknąć program. NIestety nie zawsze jest to możliwe lub nie zawsze mamy na tyle doświadczenia żeby umieć to przewidzieć (szczególnie jeżeli dopiero zaczynamy się zajmować jakąś działką), a czasem jest po prostu tak, że w trakcie pisania programu zmienia się koncept Twój lub klienta - czasu zawsze jest mało, więc czasem trzeba sztukować/drutować.

Nasze doświadczenie rośnie z każdą napisaną linijką kodu - dzięki temu zaczynamy być wrażliwi na potencjalne sytuacje i pułapki, które będą skutkowały protezą.

Ja walczę z takimi sytuacjami w taki sposób: ZANIM napiszę choćby linijkę kodu. Zanim uruchomię środowisko Delphi, uruchomię managera bazy danych czy cokolwiek związanego z projektem - odpowiadam sobie na jedno zaje...ście, ale to zaj...ście ważne pytanie: Co ma program robić i jak. Dopiero potem siadam do pisania (to tak parafrazując tekst Laski z "Chłopaki nie płaczą").

Słowem - warto się zatrzymać i zastanowić jak rozplanować pracę, jak operację, którą chesz zaprogramować zrobić manualnie - łapkamim, co będziesz potrzebował. Słowem zrobić szkielet/makietę aplikacji na kartce (czasem z rysunkami konkretnych okienek) i dopeiro wtedy siadać do pisania.

Ja mam inny problem. Czasem za bardzo skupiam się na detalach i poprawiam je bez końca. Traci na tym szkielet programu i czasem mam przez to problemy z terminowością realizacji zleceń. Irytuje mnie to, bo wiem, że tracę czas, a to co najważniejsze stoi w miejscu, ale nie mogę spokojnie przejść do porządku dziennego nad tym, że jakiś fragmencik aplikacji nie działa idealnie tak jak sobie to wyobrażam. Czasem te zajawki powodują, że zaczynam myśleć o sobie jak o pedancie. Tragedia.

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