Delphi - 在运行时创建MySQL数据库

时间:2013-04-16 22:14:36

标签: mysql sql delphi runtime

我有一个连接到MySQL数据库的delphi应用程序,但是,我想为我的最终用户创建一个简单的方法来实现MySQL数据库。我想在我的应用程序中创建一个按钮,用户可以按这个按钮删除当前的scehma实例,并使用我的应用程序需要运行的正确表和列创建一个新模式。

我编写了代码来创建新数据库。它如下:

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语法错误。我得到了:

  
     fakeschema附近的SQL语法中的

错误; 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。

5 个答案:

答案 0 :(得分:4)

正如我的一条评论中所提到的,问题是尝试在单个TAdoQuery组件中执行多个单个 SQL语句。

在理想的世界中,你会有一个像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进行测试,然后当您知道脚本正在运行时,可以通过程序运行它。如果要在执行时隐藏命令窗口,请将ShellExecute中的SW_SHOW更改为SW_HIDE。这样你甚至根本不需要任何组件 - 只需在路径中访问mysql.exe或在cmd语句中包含完整路径。

这是在MySQL 5.1中完成的,所以希望适用于3.5 ...

答案 1 :(得分:0)

如果您查看MySQL {x的documentation,并在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 :(得分:0)

如果您收到类似

的MySQL错误消息
  

错误的SQL语法附近&#39; (引用)&#39;

您始终必须查看引用部分之前的代码。

在这个特例CREATE SCHEMA IF NOT EXISTS fakeschema;

documentation对此也很清楚

  

从MySQL 5.0.2 开始,CREATE SCHEMA是CREATE DATABASE的同义词。

所以你不能使用这个同义词,因为你的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)
);  

答案 3 :(得分:0)

不涉及cmd.exe的解决方案(基于@Jason的)是使用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);

答案 4 :(得分:0)

我努力找到如何创建数据库。我正在使用&#34; Zeos&#34;:

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.

我希望我可以帮助任何人;

最好的问候