场景

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

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

注:

博客主页:
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[].Rows)
{
idx = new IdxRecord();
idx.IdxID = DataProcessor.RowValue(row, "Idx_ID", );
idx.DataPoint = DataProcessor.RowValue(row, "Data_Point", );
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[].Rows)
{
idx = new IdxRecord();
idx.IdxID = DataProcessor.RowValue(row, "Idx_ID", ); idxList.Add(idx);
}
Console.WriteLine("储存索引数据成功,成功储存数量为:" + idxList.Count);
Console.WriteLine("查询索引数据成功");
Console.WriteLine("开始根据索引数据查询记录数据...");
//在循环中根据索引数据查询记录数据
for (int i = ; i+ < 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 + ].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[].Rows[];
entity.DataPoint = DataProcessor.RowValue(row, "Data_Point", );
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[].Rows)
{
aux = new AuxRecord();
aux.DataPoint = DataProcessor.RowValue(auxrow, "Data_Point", );
aux.IvIndex = DataProcessor.RowValue(auxrow, "IvIndex", );
foreach (DataColumn col in auxTDs.Tables[].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( * );//
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[].DataPoint + "','" + auxRecords[].IvIndex + "','" + auxRecords[].Data[] + "')";//添加sql语句
cmd.ExecuteNonQuery();//执行
}
Console.WriteLine("插入辅助通道温度数据成功");
trans.Commit();//执行完成之后提交
return true; }
catch (Exception e)
{
//执行sql语句失败,事务回滚
trans.Rollback();
return false; }
finally
{
conn.Close(); }
}
}

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

  1. Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html     http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...

  2. [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值

    本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /****************************** ...

  3. JPA使用nativequery多表关联查询返回自定义实体类

    本文为JPA的学习采坑,如有问题欢迎指正. JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询.所以想要寻找一种好用的解决方案. JPA多表关联 ...

  4. java解析导入excel表格转为实体类javabean,根据实体类中的中文名称

    最近公司需求解析excel,一开始使用poi做的挺好的,后来直接上了几十万条数据的excel文件,内存直接溢出了,网上查到apache poi还提供了专门处理海量数据的方法,使用sax解析,果然用了内 ...

  5. C#反射 字符串转为实体类,并做为参数传入泛型方法中使用

    工作中有这样一个需求,有N张不同的报表,每张报表对应一个数据源,统计数据采用内存方式,首先在内在里定义了数据源对应实体.统计条件用lamdba表达式式实现,通过工具对单元格进行定义.在实现过程中针对每 ...

  6. 在MVC架构中使用CodeSmith生成NHibernate映射对象和实体类

    第一步:找到生成模板,如下图 第二步:配置数据库连接(如下图),然后右击第一步找到的模板,点击Excute 第三步:执行操做(如下图) 第四步: 找到之前配置生成的文件夹,找到如下文件(图中标记的文件 ...

  7. C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值

    一.引入 最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与 ...

  8. java中VO的使用(组成复杂的实体类)

    https://blog.csdn.net/G0_hw/article/details/78326359

  9. JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法

    在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法.   这2种方式都可以实现不用persist ...

随机推荐

  1. at、crontab、anacron的基本使用

    Linux的任务调度机制主要分为两种: 1. 执行一次:将在某个特定的时间执行的任务调度 at 2. 执行多次: crontab 3.关机后恢复尚未执行的程序 anacron. ①at at命令用于在 ...

  2. hasChildNodes()

    hasChildNodes():方法可以用来检查一个给定的元素是否有子节点. booleanValue = element.hasChildNodes 这个方法将返回一个布尔值true或false.如 ...

  3. Python模块——loguru日志模块简单学习

    Python loguru模块简单学习 首先安装模块:pip install logoru,然后引入模块: from loguru import logger 1.直接输出到console logge ...

  4. 【Android - 自定义View】之View的draw过程解析

    draw(绘制)过程的作用是将View绘制到屏幕上面.View中有 draw() 方法和 onDraw() 方法,但onDraw()方法是空方法:ViewGroup中没有draw()方法,也没有onD ...

  5. 【Android - IPC】之ContentProvider简介

    1.Content Provider简介 Content Provider是Android中提供的一种专门用于不同应用之间进行数据共享的方式,从这一点来看,它天生就适合IPC(Inter-Proces ...

  6. Chapter 04—Basic Data Management

    1. 创建新的变量 variable<-expression expression:包含一组大量的操作符和函数.常用的算术操作符如下表: 例1:根据已知变量,创建新变量的三种途径 > my ...

  7. 单例模式-python

    单例模式 什么是单例 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例 有什么优点 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管 ...

  8. Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the server requires more time

    启动Tomcat服务器时经常遇到这个错误, Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the ser ...

  9. FastAdmin的基本使用

    FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架. 1.在线命名管理 (1)菜单的生成 (2)一键 crud  首先要安装在线命名 在翡翠分类生成菜单,如下: 它的 ...

  10. Python中 * 与 **, *args 与 **kwargs的用法

    * 用于传递位置参数(positional argument) ** 用于传递关键字参数(keyword argument) 首先,先通过一个简单的例子来介绍 * 的用法: def add_funct ...