Erro com comandos SQL em lote

Firebird

19/10/2009

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.


Wander Waldemorte

Wander Waldemorte

Curtidas 0

Respostas

Afarias

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+


GOSTEI 0
Wander Waldemorte

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();


GOSTEI 0
Afarias

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:


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
POSTAR