2013-04-16 5 views
4

У меня есть приложение delphi, которое подключается к базе данных MySQL, однако я хотел бы дать простой способ для моего конечного пользователя реализовать базу данных MySQL. Я думал о создании кнопки в моем приложении, которую пользователь мог нажать, чтобы удалить все текущие экземпляры scehma, и создать новую схему с правильными таблицами и столбцами, которые мое приложение должно выполнять.Delphi - Создание базы данных MySQL во время выполнения

Я написал код для создания новой базы данных. Это выглядит следующим образом:

CREATE SCHEMA IF NOT EXISTS fakeschema; 
USE fakeschema; 
CREATE TABLE table1 
(IDtable1 int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
Line1 varchar(45), 
Line2 varchar(45)); 

Функция кода правильно в MySQL, но я получаю ошибку SQL синтаксиса при выполнении кода. Я получаю от:

ошибка в вашем SQL синтаксиса около «USE fakeschema; CREATE TABLE table1 (IDtable1 INT (11) PRIMARY KEY NO»

Я использую ADOConnection ссылку на источник данных. Я пишу строку соединения после того, как была нажата кнопка. Я использую ADOQuery для выполнения кода SQL

Вот фрагмент кода, который я использую для подключения к базе данных:.?

ADOC.ConnectionString := 'PROVIDER = MSDASQL; DRIVER={MySQL ODBC 3.51 Driver}; 
SERVER=localhost; Data Source=faketest; DATABASE=fakeschema; USER ID=root; 
PASSWORD=pass; OPTION=3;'; 
ADOC.DefaultDatabase := 'fakeschema'; 
ADOC.Connected := True; 

я использую неправильные инструменты/методы Я новичок в MySQL, и я Я в настоящее время изучаю Delphi.

+0

«Я получаю сообщение об ошибке SQL Syntax» без размещения конкретного сообщения об ошибке вы принимающую бессмысленно. Пожалуйста, отредактируйте свой вопрос и включите ** точное сообщение об ошибке **. Благодарю. –

+0

@KenWhite Я сделал редактирование. Спасибо – Turtle254

+0

@KenWhite Я понимаю, что вы имеете в виду. У меня было много проблем в прошлом, и все, что мне нужно было сделать, это отредактировать несколько символов. Однако, похоже, это не так.Я попытался удалить auto_inc и notnull, и я попытался запустить скобку столбца из 'line1', так что линия id была полностью удалена ... гайка не повезло. Оба обеспечивают ту же самую ошибку, только с соответствующими строками кода. – Turtle254

ответ

4

Как уже упоминалось в одном из моих комментариев, проблема заключается в том, чтобы выполнить несколько операторов SQL в одном компоненте TAdoQuery.

В идеальном мире у вас будет такой компонент, как MyDAC, у которого есть компонент скрипта, который вы могли бы использовать вместо TAdoQuery (MyDAC предоставил бы вам другие преимущества, такие как отсутствие необходимости подключения через ODBC). Я не знаю, есть ли там свободные компоненты MySQL, у которых есть компонент сценариев.

Другой подход - вы можете создать файл сценария (например, createFakeSchema.sql) и выполнить его через командную строку.например:

createFakeSchema.sql:

CREATE SCHEMA IF NOT EXISTS fakeschema; 
USE fakeschema; 
CREATE TABLE table1 
(IDtable1 int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
Line1 varchar(45), 
Line2 varchar(45)); 

и пример исходного кода:

procedure TfrmMain.DoExecuteScriptFile; 
var 
    cmd: string; 
    KeepOpen: Boolean; 
begin 
    KeepOpen := True; 

    // option to automatically close window once execution is done 
    // for releasing you would not want it kept open, but handy for debugging 
    if KeepOpen then 
    cmd := '/k ' 
    else 
    cmd := '/c '; 

    cmd := cmd + Format(' mysql -uroot -proot -D%s < "%s"', ['FakeSchema', 'createFakeSchema.sql']); 
    ShellExecute(handle,'open', 'cmd.exe', Pchar(cmd), nil, SW_SHOW); 
end; 

Таким образом, вы можете создать файл сценария извне где-то, проверить это через MySQL себя тогда, когда вы знаете, ваш скрипт работает, вы можете запустить его через свою программу. Если вы хотите скрыть окно команды при выполнении изменения SW_SHOW в ShellExecute на SW_HIDE. Таким образом, вам даже не нужны какие-либо компоненты - просто используйте mysql.exe в пути или включите полный путь в инструкцию cmd.

Это было сделано в MySQL 5.1, так что надеюсь, работает 3,5 ...

+0

Спасибо за помощь. Я разделил запросы и создал отдельный запрос для создания базы данных. У меня есть тот, который просто создает базу данных 'fakeschema', а затем у меня есть отдельный' ADOQuery', который добавляет SQL к 'CREATE table1', выполняет SQL, очищает Query, а затем добавляет и выполняет SQL для следующей таблицы и т. Д.Он работает нормально. Мне нравится идея исполнения от воинственного лица, и я могу использовать ее для использования в будущем. – Turtle254

+0

+1. Хорошо написано, и получается, что вы были правы. :-) –

0

Если вы посмотрите на documentation для MySQL 3.x и прокрутите waaay вниз по странице на CREATE TABLE, вы увидите пример в одном из сообщений комментариев о том, что кажется правильным синтаксисом. Это, кажется, больше, как это (непроверенные, конечно):

CREATE TABLE IF NOT EXISTS Table1 (
    IDtable1 int(11) NOT NULL AUTO_INCREMENT, 
    Line1 varchar(45), 
    Line2 varchar(45) 
    PRIMARY KEY (IDTable1) 
); 

Вот еще один пример, который я нашел в DevArticles

CREATE TABLE `articles` (
    `aID` int(4) NOT NULL auto_increment, 
    `auth` varchar(100) NOT NULL default '', 
    `title` varchar(100) NOT NULL default '', 
    `article_body` text NOT NULL, 
    `date_published` date NOT NULL default '0000-00-00', 
    PRIMARY KEY (`aID`) 
) 

Вы можете пересмотреть свою стратегию, хотя. Если пользователь случайно нажимает кнопку Reset Database и удаляет все свои данные, это может вызвать некоторые проблемы (возможно, юридические, в зависимости от того, где вы живете и какие данные задействованы). :-)

Возможно, было бы лучше подумать о резервном копировании данных, а затем вместо этого сделать таблицы TRUNCATE, где вы могли бы восстановить из резервной копии, если что-то пошло не так. Это позволит повторно использовать существующую схему.

+2

Я не думаю, что его утверждение «Создать таблицу» - проблема - отлично работает для меня в версии 5.1, но в более старых версиях могут быть различия. Я думаю, что проблема заключается в попытке выполнить несколько операторов в одном компоненте TADOQuery – Jason

+0

@Jason: Если это так, быстрое изменение компонента 'TADOCommand' может его исправить, потому что я выполнил несколько операторов там, используя SQL Server. Как я уже сказал, я не могу проверить в любом случае, потому что в настоящее время у меня нет MySQL. Документы для MySQL 3.x, по-видимому, указывают на то, что синтаксис неверен, но я не смотрел 5.1, потому что плакат сказал 3.51 в строке подключения (5.1 документа не являются актуальными тогда). :-) С TSQL вы должны опустить 'GO' (он используется только SSMS), но синтаксис плаката отлично работает с исправлениями типа данных. –

+0

Достаточно. FWIW, я установил TAdoCommand.CommandText в исходный SQL (за вычетом строки создания базы данных), а вызов Execute дал точную ошибку, полученную OP. Удаление строки использования fakeschema из TAdoCommand.CommandText работало правильно, поэтому я все еще склоняюсь к нескольким операторам в одном TAdoQuery :). – Jason

0

Если вы когда-либо появляется сообщение об ошибке MySQL как

ошибка в вашем SQL синтаксиса около '(цит) '

вы всегда должны смотреть на код, который перед тем, что процитировано часть.

В этом особом случае CREATE SCHEMA IF NOT EXISTS fakeschema;

documentation также очень ясно о том, что

СОЗДАТЬ SCHEMA является синонимом CREATE DATABASE, как в MySQL 5.0.2.

Таким образом, вы не можете использовать этот синоним, потому что ваш сервер MySQL (версии ниже 5.0.2) или в данном случае драйвер ODBC не знал этого.

Это должно избавиться от сообщения об ошибке в тока

CREATE DATABASE IF NOT EXISTS fakeschema; 
USE fakeschema; 
CREATE TABLE table1(
    IDtable1 int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, 
    Line1 varchar(45), 
    Line2 varchar(45) 
); 
+0

Проблема все еще существует, даже если вы удаляете оператор создания базы данных, потому что OP пытался выполнить три оператора в одном TAdoQuery - как я понимаю. Конечно, оператор CREATE SCHEMA не может использоваться, как указано вами сейчас, но я считаю, что он все равно столкнется с той же проблемой (я делаю на Delphi 7 и MySQL 5.1) – Jason

0

Раствор (на основе @Jason «s), которая не включает в себя cmd.exe является использование MySQL Source команду:

cmd := '-u USER_NAME -pUSER_PASSWORD DB_NAME -e "source createFakeSchema.sql"'; 
ShellExecute(handle, 'open', 'mysql.exe', Pchar(cmd), 'PATH_TO_MYSQL', SW_SHOW); 
0

Я сделал тяжелую работу, чтобы найти, как создать базу данных. Я использую «Zeos»:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, ShellAPI, ZAbstractConnection, ZConnection, DB, 
    ZAbstractRODataset, ZAbstractDataset, ZDataset; 

type 
    TForm1 = class(TForm) 
    btn1: TButton; 
    ZConnection1: TZConnection; 
    ZQuery: TZQuery; 
    btn2: TButton; 
    procedure btn1Click(Sender: TObject); 
    procedure btn2Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.btn1Click(Sender: TObject); 
begin 
    ZConnection1.Protocol := 'mysql-5'; 
    ZConnection1.Database := ''; 
    ZConnection1.User := 'root'; 
    ZConnection1.Password := 'root'; 
    ZConnection1.Connect; 
end; 

procedure TForm1.btn2Click(Sender: TObject); 
var 
    vSQL : string; 
begin 
    ZQuery.Close; 
    ZQuery.SQL.Clear; 
    vSQL := 'CREATE DATABASE IF NOT EXISTS `test`'; 
    ZQuery.SQL.Add(vSQL); 
    ZQuery.ExecSQL; 
end; 

end. 

Я надеюсь, что смогу помочь кому угодно;

С наилучшими пожеланиями

Смежные вопросы