Erro com comandos SQL em lote
Pessoal, estou com um problema que parece ser simples mas já pesquisei em tudo quanto é lugar e sempre passam a mesma solução, sendo que esta não funciona pra mim!
Tenho uma aplicação em C# com banco Firebird. Preciso enviar em um comando só várias instruções SQL de insert e update em uma transação só, mas ele entende que são vários comandos usando o SET TERM ou não!
_______________
* Sem o SET TERM:
UPDATE CLIENTE SET CLI_TEL_COM = ´AAA´;
UPDATE CLIENTE SET CLI_TEL_RES = ´EEE´;
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, column 1.
UPDATE.
_______________
* Com o SET TERM:
SET TERM ^ ;
UPDATE CLIENTE SET CLI_TEL_COM = ´AAA´^
UPDATE CLIENTE SET CLI_TEL_RES = ´EEE´^
SET TERM ; ^
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 5.
TERM.
_______________
Alguém sabe como resolvo isso?!
Abraços!
Walter.
Tenho uma aplicação em C# com banco Firebird. Preciso enviar em um comando só várias instruções SQL de insert e update em uma transação só, mas ele entende que são vários comandos usando o SET TERM ou não!
_______________
* Sem o SET TERM:
UPDATE CLIENTE SET CLI_TEL_COM = ´AAA´;
UPDATE CLIENTE SET CLI_TEL_RES = ´EEE´;
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, column 1.
UPDATE.
_______________
* Com o SET TERM:
SET TERM ^ ;
UPDATE CLIENTE SET CLI_TEL_COM = ´AAA´^
UPDATE CLIENTE SET CLI_TEL_RES = ´EEE´^
SET TERM ; ^
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 5.
TERM.
_______________
Alguém sabe como resolvo isso?!
Abraços!
Walter.
Wander Waldemorte
Curtidas 0
Respostas
Afarias
19/10/2009
Opa,
O ´SET TERM´ não tem nada a ver com a história.
Para executar vários comandos em ´lote´ é necessário que o ´componente´ que está usando para executar os comandos permita isso. Componentes QUERY em geral NÃO permitem, e vc deve usar um componente específico para scripts.
Entretanto isso não quer dizer que vc não possa executá-los dentro de uma transação. VC PODE! Tipo:
IniciarTransação;
ExecutarComando1;
ExecutarComando2;
...
FecharTransação; // commit
T+
O ´SET TERM´ não tem nada a ver com a história.
Para executar vários comandos em ´lote´ é necessário que o ´componente´ que está usando para executar os comandos permita isso. Componentes QUERY em geral NÃO permitem, e vc deve usar um componente específico para scripts.
Entretanto isso não quer dizer que vc não possa executá-los dentro de uma transação. VC PODE! Tipo:
IniciarTransação;
ExecutarComando1;
ExecutarComando2;
...
FecharTransação; // commit
T+
GOSTEI 0
Wander Waldemorte
19/10/2009
Então será que a biblioteca do Firebird para C# não permite isso? Estou usando os seguintes objetos:
FbConnection Cn = new FbConnection(´User=SYSDBA; Password=masterkey; Dialect=3; Database=C:\Projeto GVH\Banco\GVH.FDB´);
FbCommand Cm = new FbCommand(sSQLComando, Cn);
Cn.Open();
Cm.ExecuteNonQuery();
Cn.Close();
Cm.Dispose();
FbConnection Cn = new FbConnection(´User=SYSDBA; Password=masterkey; Dialect=3; Database=C:\Projeto GVH\Banco\GVH.FDB´);
FbCommand Cm = new FbCommand(sSQLComando, Cn);
Cn.Open();
Cm.ExecuteNonQuery();
Cn.Close();
Cm.Dispose();
GOSTEI 0
Afarias
19/10/2009
Humm... Pois é, acredito q FBCommand executa apenas 1 comando.
Para executar vários comandos vc poderia usar FBScript/FbBatchExecution (namespace FirebirdSql.Data.Firebird.Isql)
tipo:
T+
Para executar vários comandos vc poderia usar FBScript/FbBatchExecution (namespace FirebirdSql.Data.Firebird.Isql)
tipo:
TextReader content = ResourceReader.GetResourceContent(...); // ler o script, só exemplo
FbScript sc = new FbScript(content);
sc.Parse(); // verifica o script
FbBatchExecution fbe = new FbBatchExecution(conn as FbConnection);
foreach (string cmd in sc.Results) {
fbe.SqlStatements.Add(cmd); // adiciona os comandos
}
fbe.Execute(); // executa
T+
GOSTEI 0