使用.NET Data Provider访问DM8中BLOB字段
1、引入DLL
.NET FrameWork环境中访问DM8,要引入达梦官方DLL“DmProvider.dll”,安装完DM8后,可在路径“DM8安装目录\drivers\dotNet\DmProvider\net20\DmProvider.dll”中找到。
2、访问DM8中BLOB字段流程
.NET FrameWork环境下访问DM8的流程如下
查询流程如下:
(1)通过连接字符串创建Dm数据库连接,即DmConnection对象,并调用Open方法打开连接。
(2)创建DbCommand对象,其属性Connection绑定DmConnection对象;属性CommandType指定操作类型Text(Sql文本),StoredProcedure(存储过程或函数)。
(3)DbCommand执行ExecuteReader方法。
(4)解析DbDataReader对象,BLOB类型的字段将其转为字节类型数组byte[]。
(5)关闭DbDataReader对象。
关闭DmConnection对象。
增、改流程如下:
(1)通过连接字符串创建Dm数据库连接,即DmConnection对象,并调用Open方法打开连接。
(2)通过DmConnection对象创建事务,并设置事务隔离级别。
(3)创建DbDataReader对象,属性Connection绑定DmConnection对象,属性Transaction绑定DbTransaction对象;属性CommandType指定操作类型Text(Sql文本),StoredProcedure(存储过程或函数)。
(4)创建DmParameter对象作为插入或修改的参数,与数据库中表的字段对应。BLOB字段对应的该对象的DbType属性为DmDbType.Blob,其值为字节数组byte[],最后将参数添加到DmCommand的属性Parameters中。
(5)执行插入或更新操作,若操作成功则提交事务;若失败则回滚事务。
(6)若返回值类型为表值,则关闭DbDataReader对象。
(7)关闭DmConnection对象。
3、用例
在DM8中创建用户HX,并在用户HX的模式HX下创建表ta_test,表结构如下:
列名 | 列类型 |
---|---|
id | int |
name | varchar2(50) |
introduction | clob |
picture | blob |
向该表插入一条数据(包含blob字段)的代码如下:
//本段代码的功能是向表ta_test插入一条数据。
static void Main(string[] args)
{
string connStr = "server=172.20.10.4;userid=HX;pwd=test;"; //连接字符串
string sql = "insert into hx.ta_test values(:id,:name,:introduction,:picture)"; //将图片二进制信息存入数据库,占位符用':'
DmConnection conn = new DmConnection(connStr); //创建与达梦数据库的连接对象
conn.Open(); //打开连接
DbDataReader dr = null;
DmParameter id = new DmParameter("id", DmDbType.Int32); //insert语句参数id
id.Value = 1;
DmParameter name = new DmParameter("name", DmDbType.VarChar); //
name.Value = "zhangsan";
DmParameter introduction = new DmParameter("introduction", DmDbType.Clob); //大文本对象,需要从文本里读取
DmParameter picture = new DmParameter("picture", DmDbType.Blob); //大二进制对象,这里是从图片文件中读取
StringBuilder builder = new StringBuilder();
//读取文本文件内容作为clob字段内容
using (FileStream fs = new FileStream(@"C:\Users\22740\Desktop\达梦数据库\test.txt", FileMode.Open, FileAccess.Read))
{
int len = 0;
byte[] temp = new byte[1024];
while ((len = fs.Read(temp, 0, 1024)) > 0)
{
string info = Encoding.GetEncoding("gb2312").GetString(temp, 0, len);
builder.Append(info);
}
introduction.Value = builder.ToString();
}
//读取图片文件将其转化为字节数组作为blob字段内容
using (FileStream reader = new FileStream(@"C:\Users\22740\Desktop\达梦数据库\p1.jpg", FileMode.Open, FileAccess.Read))
{
int len = 0;
byte[] temp = new byte[reader.Length];
reader.Read(temp, 0, temp.Length);
picture.Value = temp;
}
//开启事务
using (DbTransaction transaction = conn.BeginTransaction())
{
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql; //绑定sql
cmd.CommandType = CommandType.Text; //设置命令类型为sql文本
cmd.Transaction = transaction; //绑定事务对象
try
{
cmd.Parameters.Add(id); //添加id命令参数
cmd.Parameters.Add(name); //添加name命令参数
cmd.Parameters.Add(introduction);
cmd.Parameters.Add(picture);
cmd.ExecuteNonQuery(); //执行insert语句
transaction.Commit(); //事务提交
}
catch (Exception exp)
{
Console.WriteLine("insert error:" + exp.Message);
transaction.Rollback(); //事务回滚
}
}
}
conn.Close(); //关闭数据库连接
}
向该表查询一条数据(包含blob字段)的代码如下:
//本段代码功能是查询表ta_test的数据
DmConnection conn = new DmConnection("server=172.20.10.4;userid=HX;pwd=test;");
string sql = "select id,name,introduction,picture from hx.ta_test";
DbDataReader dr = null;
conn.Open();
using (DbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
dr = cmd.ExecuteReader();
}
List<ta_test> list = new List<ta_test>();
while (dr.Read())
{
ta_test test = new ta_test();
test.Id = int.Parse(dr["id"].ToString());
test.Name = dr["name"].ToString();
test.Introduction = dr["introduction"].ToString();
test.Picture = dr["picture"] as byte[];
list.Add(test);
}
conn.Close();