使用.NET Data Provider访问DM8中BLOB字段

使用.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的流程如下
访问DM8中BLOB字段流程

  查询流程如下:
  (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,表结构如下:

列名列类型
idint
namevarchar2(50)
introductionclob
pictureblob

  向该表插入一条数据(包含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();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值