C#中怎样连接数据库并将查询结果转为实体类以及如何加入事务
2024-09-01 20:22:01
场景
新建一个程序,需要对数据的表进行查询并将查询结果转换为实体类,然后将多个实体类
再插入到另一个数据库的表中,执行插入的过程中要使用事务。
注:
博客主页:
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(); }
}
}
最新文章
- 策划编写一个新的Helper类
- Android Studio 导入百度地图jar和so的正确方式
- Nginx 开启gzip 压缩
- hashMap的get()方法,错用并发造成cpu和负载高
- 利用Node.js对某智能家居服务器重构
- JDSideMenu实现(整块)侧滑功能,主视图会和状态栏(StatusBar)会一起滑动。
- Piggy-Bank
- LF CRLF
- Spring多资源文件properties的配置
- c++回调实现
- Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程
- java中获取路径的方法
- 并行动画组QParallelAnimationGroup
- Confluence 6 空间
- 【uoj#228】基础数据结构练习题 线段树+均摊分析
- Java NIO学习与记录(二):FileChannel与Buffer用法与说明
- onbeforeunload 适用DOM 0级,不适用 DOM 2级
- 修改android Studio SDK 路径产生的问题(模拟器不能启动了)
- Redis搭建(六):Redis持久化配置
- UVA-10929-You can say 11(秦九昭算法+同余与模算术)
热门文章
- vi指令详解
- 从两个List集合里找到相同部分和不同部分
- 2019牛客暑期多校训练营(第九场) E All men are brothers
- Spring Boot整合Mybatis报错InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider
- fastjson 1.2.24-基于JdbcRowSetImpl的PoC构造与分析
- 九、Spring Boot 优雅的实现CORS跨域
- 实战webpack系列01
- 监控io性能、free、ps命令、查看网络状态、Linux下抓包 使用介绍
- 图解leetcode —— 124. 二叉树中的最大路径和
- vue反向代理(解决跨域)