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

Wesley13
• 阅读 691

场景

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

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

注:

博客主页:
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();

                }
            }
        }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
oracle查询表数据并重新插入到本表
oracle查询表数据并重新插入到本表CreateTime2018年5月17日10:30:10Author:Marydon1.情景描述查询表中数据SELECTFROMat_aut
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这