欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#中怎样连接数据库并将查询结果转为实体类以及如何加入事务

程序员文章站 2022-05-03 12:46:26
场景 新建一个程序,需要对数据的表进行查询并将查询结果转换为实体类,然后将多个实体类 再插入到另一个数据库的表中,执行插入的过程中要使用事务。 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送 ......

场景

新建一个程序,需要对数据的表进行查询并将查询结果转换为实体类,然后将多个实体类

再插入到另一个数据库的表中,执行插入的过程中要使用事务。

注:

博客主页:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

不带事务只是查询

//储存数据的工具初始化
            dataset idxds = new dataset();
            //constr:数据库连接字符串配置
           stringconstr="server=localhost;database=badao;uid=sa;pwd=123";
            using (sqlconnection conn=new sqlconnection(constr))
           
            {
  
                conn.open();
                console.writeline("开始查询索引数据...");
                //查询索引数据
                string idxsql = "select * from idx1_1";//获取sql语句
                sqldataadapter idxsda = new sqldataadapter(idxsql, conn);   //(查询语句和连接工具)
                idxsda.fill(idxds);    //将适配器数据存入dataset工具中
             }

 

注:

首先声明一个dataset用来存储执行查询的结果,然后使用连接数据的字符串打开连接。

然后使用adapter执行sql语句,将查询结果填充到dataset中。

怎样将查询结果与实体类对应赋值

                idxrecord idx = null;
                console.writeline("开始储存索引数据...");
                foreach (datarow row in idxds.tables[0].rows)
                {
                    idx = new idxrecord();
                    idx.idxid = dataprocessor.rowvalue(row, "idx_id", 0);
                    idx.datapoint = dataprocessor.rowvalue(row, "data_point", 0);
                    idx.scheduleindex = dataprocessor.rowvalue(row, "schedule_index", 0l);                  
                    idxlist.add(idx);
                }

 

注:

声明一个实体类,其中要有与数据库列所对应的字段。

然后将dataset中的内容与实体列的属性一一赋值。

最后将实体类对象添加到实体类的list上。

其中dataprocessor.rowvalue是一个工具类中的方法,此方法中的第二个参数是对应的数据库中的列

 public static short rowvalue(datarow dr, string field, short defaultvalue)
        {
            short result = defaultvalue;
            if (dr.table.columns.contains(field))
            {
                if (dr[field] != null && dr[field] != dbnull.value)
                {
                    if (short.tryparse(dr[field].tostring(), out result))
                    {
                        return result;
                    }
                }
            }
            else
            {
                console.writeline("datatable中不存在[" + field + "]列!");
            }
            return defaultvalue;
        }

 

怎样开启事务并存入数据

            //存入bak数据库
           stringconstrbak="server=localhost;database=badaobak;uid=sa;pwd=123";
            using (sqlconnection conn = new sqlconnection(constrbak))//constr:数据库连接配置
            {
                conn.open();
                //开启事务
                sqltransaction trans = conn.begintransaction();
                sqlcommand cmd = new sqlcommand();
                cmd.connection = conn;//添加连接工具
                cmd.transaction = trans;//添加事务
                try
                {
                    cmd.commandtext = "insert into idx1_1 values  ('" + idx.idxid + "','" + idx.stepend +"')";//添加sql语句
                    cmd.executenonquery();//执行
                    console.writeline("插入索引数据成功");
                    trans.commit();//执行完成之后提交
                   

                }
                catch (exception e)
                {
                    //执行sql语句失败,事务回滚
                    trans.rollback();
                  

                }
                finally
                {
                    conn.close();

                }
            }

 

完整示例代码

 public static void main(string[] args)
        {
            list<idxrecord> idxlist = null;         //索引数据
            //储存数据的工具初始化
            dataset idxds = new dataset();
            //constr:数据库连接字符串配置
            string constr = "server=localhost;database=badao;uid=sa;pwd=123";
            using (sqlconnection conn=new sqlconnection(constr))
            {
                conn.open();
                console.writeline("开始查询索引数据...");
                //查询索引数据
                string idxsql = "select * from idx1_1";//获取sql语句
                sqldataadapter idxsda = new sqldataadapter(idxsql, conn);   //(查询语句和连接工具)
                idxsda.fill(idxds);    //将适配器数据存入dataset工具中
                idxlist = new list<idxrecord>();
                idxrecord idx = null;
                console.writeline("开始储存索引数据...");
                foreach (datarow row in idxds.tables[0].rows)
                {
                    idx = new idxrecord();
                    idx.idxid = dataprocessor.rowvalue(row, "idx_id", 0);
                   
                    idxlist.add(idx);
                }
                console.writeline("储存索引数据成功,成功储存数量为:" + idxlist.count);
                console.writeline("查询索引数据成功");
                console.writeline("开始根据索引数据查询记录数据...");
                //在循环中根据索引数据查询记录数据
                for (int i = 0; i+1 < idxlist.count;i++)
                {
                    list<record> recordlist = new list<record>();
                    list<list<auxrecord>> autxrecordslist = new list<list<auxrecord>>();
                    for (int k = idxlist[i].datapoint; k < idxlist[i + 1].datapoint;k++ )
                    {
                        dataset recordsds = new dataset();
                        dataset auxtds = new dataset();
                        //查询 记录数据
                        string recordsql = "select * from wsc1_1 where data_point =" + k;//获取sql语句
                        //console.writeline("开始执行的查询语句为:" + recordsql);
                        sqldataadapter recordssda = new sqldataadapter(recordsql, conn);   //(查询语句和连接工具)
                        recordssda.fill(recordsds);    //将适配器数据存入dataset工具中
                        record entity = new record();
                        datarow row = recordsds.tables[0].rows[0];
                        entity.datapoint = dataprocessor.rowvalue(row, "data_point", 0);
                        entity.scheduleindex = dataprocessor.rowvalue(row, "schedule_index", 0l);
                        
                        recordlist.add(entity);
                        //console.writeline("根据索引数据的datapoint:" + k + "查询到的记录数据的datapoint:" + entity.datapoint);

                        //根据索引数据查询辅助通道温度数据
                        console.writeline("开始根据记录数据查询辅助通道温度数据....");
                        list<auxrecord> autxrecords = new list<auxrecord>();         //辅助通道温度数据
                        string auxtsql = "select * from aux1_1_25 where ivindex =" + entity.auxindex;//获取sql语句
                        sqldataadapter auxtsda = new sqldataadapter(auxtsql, conn);   //(查询语句和连接工具)
                        auxtsda.fill(auxtds);    //将适配器数据存入dataset工具中
                        //autxrecords = new list<auxrecord>();
                        auxrecord aux = null;
                        foreach (datarow auxrow in auxtds.tables[0].rows)
                        {
                            aux = new auxrecord();
                            aux.datapoint = dataprocessor.rowvalue(auxrow, "data_point", 0);
                            aux.ivindex = dataprocessor.rowvalue(auxrow, "ivindex", 0);
                            foreach (datacolumn col in auxtds.tables[0].columns)
                            {
                                if (col.columnname.startswith("t") || col.columnname.startswith("v"))
                                {
                                    aux.data.add(dataprocessor.rowvalue(row, col.columnname, 0d));
                                }
                            }
                            autxrecords.add(aux);
                        }
                        autxrecordslist.add(autxrecords);
                        console.writeline("根据记录数据查询辅助通道温度数据成功");

                        
                    }
                    //conn.close();
                    //开始向数据库插入中传递参数
                    bool isstoresuccess = storerecorddata(idxlist[i],recordlist,autxrecordslist);
                    if (isstoresuccess)
                    {
                        console.writeline("存入数据库成功");
                    }
                    else
                    {
                        console.writeline("存入数据库失败");
                    }
                    //开始休眠
                    console.writeline("开始休眠...");
                    system.threading.thread.sleep(1000 * 5);//
                    console.writeline("休眠结束...");

                }
                
                //console.writeline("查询辅助通道温度数据成功");
                //console.readkey();
                
            }
        }

        public static bool storerecorddata(idxrecord idx, list<record> recordlist, list<list<auxrecord>> autxrecordslist)
        {
            //存入bak数据库
            string constrbak = "server=localhost;database=badaobak;uid=sa;pwd=123";
            using (sqlconnection conn = new sqlconnection(constrbak))//constr:数据库连接配置
            {
                conn.open();
                //开启事务
                sqltransaction trans = conn.begintransaction();
                sqlcommand cmd = new sqlcommand();
                cmd.connection = conn;//添加连接工具
                cmd.transaction = trans;//添加事务
                try
                {
                    cmd.commandtext = "insert into idx1_1 values  ('" + idx.idxid + "','" + idx.datapoint + "','" + idx.stepend +"')";//添加sql语句
                    cmd.executenonquery();//执行
                    console.writeline("插入索引数据成功");
                    foreach(record record in recordlist)
                    {
                        cmd.commandtext = "insert into wsc1_1 values  ('" + record.datapoint + "','" + record.scheduleindex + "','" + record.auxindex + "')";//添加sql语句
                        cmd.executenonquery();//执行
                    }
                    console.writeline("插入记录数据成功");
                    foreach (list<auxrecord> auxrecords in autxrecordslist)
                    {
                        cmd.commandtext = "insert into aux1_1_25 values  ('" + auxrecords[0].datapoint + "','" + auxrecords[0].ivindex + "','" + auxrecords[0].data[0] + "')";//添加sql语句
                        cmd.executenonquery();//执行
                    }
                    console.writeline("插入辅助通道温度数据成功");
                    trans.commit();//执行完成之后提交
                    return true;

                }
                catch (exception e)
                {
                    //执行sql语句失败,事务回滚
                    trans.rollback();
                    return false;

                }
                finally
                {
                    conn.close();

                }
            }
        }