SQLStatement.execute() - várias consultas em uma instrução
-
08-06-2019 - |
Pergunta
Eu escrevi um banco de dados de script de geração em SQL e quer executá-lo em minha O Adobe AIR aplicação:
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
);
...
Eu executar esta no Adobe AIR usando os seguintes métodos:
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());
}
}
Sem erros são gerados, no entanto, apenas tRole
não existe.Parece que ele só olha para a primeira consulta (até o ponto - e-vírgula, se eu remover, a consulta falha).Existe uma maneira de chamar várias consultas em uma declaração?
Solução
Acabei usando isso.É um tipo de hack, mas ele realmente funciona muito bem.
A única coisa é que você tem que ser muito cuidadoso com o seu ponto-e-vírgula.: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());
}
Outras dicas
O SQLite A API tem uma função chamada algo como sqlite_prepare
o que leva um instrução e prepara-la para a execução, essencialmente, analisar o SQL e armazená-lo na memória.Isso significa que o SQL para que seja enviada uma vez para o mecanismo de banco de dados, mesmo que a instrução é executada várias vezes.
De qualquer maneira, uma instrução é uma única consulta SQL, que é apenas a regra.O AR SQL API não permite o envio de matérias-SQL para o SQLite, apenas simples instruções, e a razão é, provavelmente, que usa o AR sqlite_prepare
função quando ele fala para o SQLite.
Que tal fazer o seu delimitador de algo um pouco mais complexo como "; ", que não seria mostrar que, muitas vezes.Você apenas tem que garantir ao criar o arquivo que você tem uma linha de retorno ou dois lá.Eu acabar colocando dois " " para a criação de meus arquivos, que funciona bem.