场景

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

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

注:

博客主页:
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. 2011-11-14:命令执行漏洞防御,PHP反序列化漏洞产生原因,笔记

    命令执行漏洞防御尽量不要使用系统执行命令在进入执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义在使用动态函数之前,确保使用的函数是指定的函数之一对PHP语言来说,不能完全控制的危险函数最好 ...

  2. linuxLVM

    一.概念性的东西 LVM2:Logical Volume Manager ,Cersion 2 LVM,依赖于内核的dm模块(将一个或多个底层的设备组织成一个逻辑设备的模块).可以将多个物理分区通过软 ...

  3. promise实现图片按照指定的加载顺序执行

    promise实现图片按照指定的加载顺序执行,先加载第二张,再加载第一张,最后加载第三张 <!DOCTYPE html> <html lang="en"> ...

  4. Linux01机和Linux02机的切换 和秘钥的配置

    先试一下 01机和02机是否可以切换成功 使用 ssh root@ip地址 输入密码 ifconfig查看ip是否正确 切换回01机 01机配置的秘钥 查看隐形文件 01机配置秘钥 输入  ssh-c ...

  5. 在React项目中添加ESLint

    1. 安装eslint npm install eslint --save-dev // 或者 yarn add eslint --dev 2. 初始化配置文件 npx eslint --init / ...

  6. Centos 7.x 系统基础优化

    Centos 7.x 系统基础优化 1.更换国内yum源 删除系统带的centos官方yum源 rm -rf /etc/yum.repos.d/* 使用国内阿里云源 curl -o /etc/yum. ...

  7. js鼠标划过事件

    js鼠标划过事件一般有两对 onmouseover/onmouseout onmouseenter/onmouseleave 区别: 1.onmouseover/onmouseout 鼠标经过自身会触 ...

  8. 配置防盗链、访问控制Directory和FilesMatch

    5月31日任务 课程内容: 11.25 配置防盗链11.26 访问控制Directory11.27 访问控制FilesMatch扩展几种限制ip的方法 http://ask.apelearn.com/ ...

  9. NSSearchPathForDirectoriesInDomains用法

    iPhone会为每一个应用程序生成一个私有目录,这个目录位于: /Users/sundfsun2009/Library/Application Support/iPhone Simulator/Use ...

  10. Python自带又好用的代码调试工具Pdb学习笔记

    返璞归真 这几天项目有一个linux下部署数据库的操作,数据库使用python进行初始化安装.然后问题来了,由于linux服务器涉及安全要求,除了代码以来的Python3.6版本外不允许安装其他插件与 ...