DmException: 试图在只读事务中修改数据
达梦数据库的事务隔离级分为四级,默认是“读提交隔离级”。
可以检查一下是否设置了隔离级别为“只读事务”。
更多关于达梦数据库的事务隔离级,请参考安装目录DOC目录下的 “系统管理员手册”--第19章节 管理事务。
.NET 程序中使用 DmBulkCopy 对象执行时报错
【问题描述】:
.NET 程序中使用 DmBulkCopy 对象执行时报错:
Unhandled exception. Dm.DmException (0x80004005): The fastloading dll not loading!
at Dm.DmFldr.Initilize(DmConnProperty props, String desttable, DmBulkCopyOptions op, Int32 rows, DataTable table)
at Dm.DmBulkCopy.WriteToServer(DataTable table)
【问题分析】:
DmBulkCopy 对象用于快速批量装载数据。实现 IDisposable 接口。该功能依赖 DM 安装目录 \bin 下的 dmfldr_dll.dll 等动态链接库,需要拷贝到应用程序的执行目录。
驱动文档里的说明:
DmProvider 文件夹中是完整的 DmProvider 驱动文件。使用 DmProvider 的DmBulkCopy 对象,需要引用 dmfldr_dll.dll 以及此 dll 依赖的其他库。
添加 dmfldr_dll.dll 引用时会报错,这种方法无效。
代码示例:
//数据库中建表
create table Person(Age varchar(100),Name varchar(100));
//
using System;
using Dm;
using System.Data;
namespace dm_net_demo
{
class Program
{
static void Main(string[] args)
{
DmConnection conn = new DmConnection();
try
{
conn.ConnectionString = "SERVER=localhost;PORT=5236;USER=SYSDBA;PASSWORD=SYSDBA;ENCODING=UTF-8";//需要指定ENCODING
conn.Open();
}
catch (Exception ex)
{
Console.WriteLine("连接数据库失败");
Console.WriteLine(ex.Message);
}
//批量插入
fun_bulk(conn);
conn.Close();
}
static void fun_bulk(DmConnection conn)
{
//准备批量插入的数据
DataTable table = new DataTable();
table.Columns.Add("Age");
table.Columns.Add("Name");
DataRow row = table.NewRow();
row["Age"] = 28;
row["Name"] = "Jack";
table.Rows.Add(row);
DataRow row1 = table.NewRow();
row1["Age"] = 29;
row1["Name"] = "Fei";
table.Rows.Add(row1);
var bulkCopy = new DmBulkCopy(conn);
bulkCopy.DestinationTableName = "Person";//在插入的目标表
//DataTable列名与数据库列名的映射
bulkCopy.ColumnMappings.Add("Age", "Age");
bulkCopy.ColumnMappings.Add("Name", "Name");
bulkCopy.WriteToServer(table);//写入到数据库中
}
}
}
【问题解答】:
在 Path 环境变量里面加上达梦的 bin 目录:
.net程序服务名连接达梦集群,备机异常时,连接异常变慢
在dm_svc.conf中配置连接超时参数connnectTimeout,可配置为connnectTimeout=(3)