4

我有一个连接到 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 语法错误。我得到:

'USE 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。

4

5 回答 5

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...

于 2013-04-17T01:58:32.247 回答
0

如果您查看 MySQL 3.x 的文档,并向下滚动页面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表可能会更好,如果出现问题,您可以从备份中恢复。这将允许重用现有模式。

于 2013-04-16T22:55:21.867 回答
0

如果您收到类似的 MySQL 错误消息

' (引用) '附近的SQL 语法错误

您总是必须查看引用部分之前的代码。

在这种特殊情况下CREATE SCHEMA IF NOT EXISTS fakeschema;

文档也很清楚

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

所以你不能使用这个同义词,因为你的 MySQL 服务器(版本低于 5.0.2)或者在这种情况下 OD​​BC 驱动程序不知道这一点。

这应该摆脱当前的错误消息

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)
);  
于 2013-04-17T05:49:01.013 回答
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);
于 2014-06-25T19:07:47.533 回答
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.

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

最好的祝福

于 2017-05-04T13:53:18.967 回答