SQLStatement.execute() - 一条语句中的多个查询
Posted
技术标签:
【中文标题】SQLStatement.execute() - 一条语句中的多个查询【英文标题】:SQLStatement.execute() - multiple queries in one statement 【发布时间】:2010-09-05 05:33:36 【问题描述】:我在SQL 中编写了一个数据库生成脚本,并希望在我的Adobe AIR 应用程序中执行它:
Create Table tRole (
roleID integer Primary Key
,roleName varchar(40)
);
Create Table tFile (
fileID integer Primary Key
,fileName varchar(50)
,fileDescription varchar(500)
,thumbnailID integer
,fileFormatID integer
,categoryID integer
,isFavorite boolean
,dateAdded date
,globalAccessCount integer
,lastAccessTime date
,downloadComplete boolean
,isNew boolean
,isSpotlight boolean
,duration varchar(30)
);
Create Table tCategory (
categoryID integer Primary Key
,categoryName varchar(50)
,parent_categoryID integer
);
...
我使用以下方法在 Adobe AIR 中执行此操作:
public static function RunSqlFromFile(fileName:String):void
var file:File = File.applicationDirectory.resolvePath(fileName);
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ)
var strSql:String = stream.readUTFBytes(stream.bytesAvailable);
NonQuery(strSql);
public static function NonQuery(strSQL:String):void
var sqlConnection:SQLConnection = new SQLConnection();
sqlConnection.open(File.applicationStorageDirectory.resolvePath(DBPATH));
var sqlStatement:SQLStatement = new SQLStatement();
sqlStatement.text = strSQL;
sqlStatement.sqlConnection = sqlConnection;
try
sqlStatement.execute();
catch (error:SQLError)
Alert.show(error.toString());
不会产生任何错误,但只有tRole
存在。似乎它只查看第一个查询(直到分号 - 如果我删除它,查询失败)。有没有办法在一个语句中调用多个查询?
【问题讨论】:
【参考方案1】:我最终使用了这个。这是一种 hack,但实际上效果很好。
唯一的事情是你必须非常小心你的分号。 : D
var strSql:String = stream.readUTFBytes(stream.bytesAvailable);
var i:Number = 0;
var strSqlSplit:Array = strSql.split(";");
for (i = 0; i < strSqlSplit.length; i++)
NonQuery(strSqlSplit[i].toString());
【讨论】:
刚刚意识到如果分号出现在 varchar 字段中,这将是多么糟糕。【参考方案2】:SQLite API 有一个类似sqlite_prepare
的函数,它接受一个 语句并准备执行,本质上是解析SQL 并将其存储在内存中。这意味着即使语句执行了多次,SQL 也只需发送一次到数据库引擎。
不管怎样,一条语句就是一条 SQL 查询,这就是规则。 AIR SQL API 不允许向 SQLite 发送原始 SQL,只能发送单个语句,原因很可能是 AIR 在与 SQLite 对话时使用了sqlite_prepare
函数。
【讨论】:
【参考方案3】:如何让你的分隔符更复杂一些,比如“;\n”,它不会经常出现。您只需要确保在创建文件时您有一两行回车即可。我最终在我的文件创建中添加了两个“\n\n”,效果很好。
【讨论】:
以上是关于SQLStatement.execute() - 一条语句中的多个查询的主要内容,如果未能解决你的问题,请参考以下文章