当前位置: 移动技术网 > IT编程>开发语言>c# > C#中怎样连接数据库并将查询结果转为实体类以及如何加入事务

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

2019年12月09日  | 移动技术网IT编程  | 我要评论

场景

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

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

注:

博客主页:

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

实现

不带事务只是查询

//储存数据的工具初始化
            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();

                }
            }
        }

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网