如何使用c#在firebird中执行事务(或多个sql查询)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用c#在firebird中执行事务(或多个sql查询),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3903字,纯文字阅读大概需要6分钟。
内容图文
![如何使用c#在firebird中执行事务(或多个sql查询)](/upload/InfoBanner/zyjiaocheng/909/6f9afb59c44345329f4bfd4d90a5ea02.jpg)
我尝试了几种方法,包括SO.
以下MYSQL代码在Firebird中不起作用:
CREATE TABLE publications (
INT NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`id`),
filename varchar(500) not null unique,
title varchar(500) DEFAULT NULL,
authors varchar(1000) DEFAULT NULL,
uploader int DEFAULT NULL,
keywords varchar(500) DEFAULT NULL,
rawtext text,
lastmodified timestamp default CURRENT_TIMESTAMP
);
所以为了在Firebird中实现这一点,我正在使用:
CREATE TABLE publications (
id int NOT NULL PRIMARY KEY,
filename varchar(500) NOT NULL UNIQUE,
title varchar(500) DEFAULT NULL,
authors varchar(1000) DEFAULT NULL,
uploader int DEFAULT NULL,
keywords varchar(500) DEFAULT NULL,
rawtext text,
file_data BLOB SUB_TYPE 0,
insertdate timestamp DEFAULT NULL
);
CREATE GENERATOR gen_t1_id;
SET GENERATOR gen_t1_id TO 0;
set term !! ;
CREATE TRIGGER journalInsertionTrigger FOR publications
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (NEW.ID is NULL) then NEW.ID = GEN_ID(GEN_T1_ID, 1);
END!!
set term ; !!
有了上述,我得到错误:
批量执行中止返回的消息是:动态SQL错误SQL错误代码= -104令牌未知 – 第13行,字符2创建“
当我取消注释// FbTransaction fbt = Connection.BeginTransaction();和//fbt.Commit();
Execute requires the Command object to have a Transaction object when
the Connection object assigned to the command is in a pending local
transaction. The Transaction property of the Command has not been
initialized.
我使用以下C#代码:
//FbTransaction fbt = Connection.BeginTransaction(); //
FbBatchExecution fbe = new FbBatchExecution( Connection );
fbe.SqlStatements = new System.Collections.Specialized.StringCollection();//.Add( queryString ); // Your string here
fbe.SqlStatements.Add( queryString ); // Your string here
fbe.Execute();
//fbt.Commit();
注意:设定设定期限; !在SQL代码的开头给出错误:无法确定SQL语句的类型
我该怎么做呢?
解决方法:
Firebird只能执行单独的SQL语句,而Firebird的大多数驱动程序都遵循相同的规则.你不能像这样一次执行脚本.
Firebird.net提供程序包含一个实用程序类,用于将脚本拆分为单个语句.
你需要做一些事情:
using (var connection = new FbConnection(@"User=sysdba;Password=masterkey;Database=D:\data\db\testdatabase.fdb;DataSource=localhost"))
{
connection.Open();
FbScript script = new FbScript(dbScript);
script.Parse();
FbBatchExecution fbe = new FbBatchExecution(connection);
fbe.AppendSqlStatements(script);
fbe.Execute();
}
请注意,要使当前脚本正常工作,您还需要替换:
rawtext text,
同
rawtext BLOB SUB_TYPE TEXT CHARACTER SET UTF8
从技术上讲,您可以省略字符集子句,但除非您为数据库定义了默认字符集,否则应指定字符集,否则它将为NONE,这可能会导致以后出现问题.
使用FbBatchExecution时,您无法自己启动事务,因为事务是在Execute方法内部处理的.请注意,如果您还想在脚本中插入(或以其他方式修改)数据,则应使用Execute(true),以便立即提交每个DDL语句. Firebird不允许DML在同一事务中使用事务中的DDL更改.
SET TERM的问题是由于SET TERM不是Firebird语法的一部分.它是ISQL和FlameRobin等工具使用的语法的一部分,例如FbScript.
如果您想单独执行这些语句并控制事务,您可以执行以下操作:
using (var connection = new FbConnection(@"User=sysdba;Password=masterkey;Database=D:\data\db\testdatabase.fdb;DataSource=localhost"))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
using (var command = new FbCommand())
{
command.Connection = connection;
command.Transaction = transaction;
command.CommandText = @"CREATE TABLE publications (
id int NOT NULL PRIMARY KEY,
filename varchar(500) NOT NULL UNIQUE,
title varchar(500) DEFAULT NULL,
authors varchar(1000) DEFAULT NULL,
uploader int DEFAULT NULL,
keywords varchar(500) DEFAULT NULL,
rawtext BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
file_data BLOB SUB_TYPE 0,
insertdate timestamp DEFAULT NULL
)";
command.ExecuteNonQuery();
command.CommandText = "CREATE GENERATOR gen_t1_id";
command.ExecuteNonQuery();
command.CommandText = @"CREATE TRIGGER journalInsertionTrigger FOR publications
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (NEW.ID is NULL) then NEW.ID = GEN_ID(GEN_T1_ID, 1);
END";
command.ExecuteNonQuery();
transaction.Commit();
}
}
内容总结
以上是互联网集市为您收集整理的如何使用c#在firebird中执行事务(或多个sql查询)全部内容,希望文章能够帮你解决如何使用c#在firebird中执行事务(或多个sql查询)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。