C#中怎样连接数据库并将查询结果转为实体类以及如何加入事务
程序员文章站
2022-05-03 12:46:26
场景 新建一个程序,需要对数据的表进行查询并将查询结果转换为实体类,然后将多个实体类 再插入到另一个数据库的表中,执行插入的过程中要使用事务。 注: 博客主页: 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(); } } }
上一篇: 亲手撸码,爬取 手机号码归属地最新数据(201911)
下一篇: .net 调用C++ dll