private void toolStripButton1_Click(object sender, EventArgs e)
{
//判断新增的年度是否已经存在
if (HasYear())
{
MessageBox.Show("该年度分配给各单位的任务已经存在!");
return;
}
else
{
#region 方法总结
//var q = from p in mf.DS.UnitPaperTask.AsEnumerable()
// where p.year == tscombYear.SelectedItem.ToString()
// select p;
//foreach (var i in q)
//{
//这个命令是直接插入库中,系统由于IO问题会非常慢,有假死现象
// mf.unitpapertaskTap.Insert(i.unitid, i.paperid, i.plantnum, tscombNewYear.SelectedItem.ToString().Trim()); //}
//mf.unitpapertaskTap.Update(mf.DS.UnitPaperTask);
//mf.unitpapertaskTap.Dispose();
//mf.unitpapertaskTap.Fill(mf.DS.UnitPaperTask);
//
//解决办法,在内存中把表筛选后,复制一个datatable,循环改year值的同时“在内存中”加入新行值。最后提交一次提交到库
//通过实践,updata也是一行一行的增加到数据库,同样的慢,看来上面的方法也对。 #endregion #region 解决方法二也是不行 //string oldYear = tscombYear.SelectedItem.ToString();
//string newYear = tscombNewYear.SelectedItem.ToString(); //DataTable dt = mf.DS.UnitPaperTask.Select("year='" + oldYear + "'").CopyToDataTable();
////dataGridView1.DataSource = dt;
//foreach (DataRow dr in dt.Rows)
//{
// dr["year"] = newYear;
// //内存中加入行 可用 dataGridView1.DataSource = mf.DS.UnitPaperTas;显示出来 // mf.DS.UnitPaperTask.AddUnitPaperTaskRow(dr["unitid"].ToString(), dr["paperid"].ToString(), Convert.ToInt32(dr["plantnum"].ToString()), dr["year"].ToString());
//} ////dataGridView1.DataSource = mf.DS.UnitPaperTask;
////也是到数据库了,同样的很慢。
//mf.unitpapertaskTap.Update(mf.DS.UnitPaperTask); //删除再填充是为了取得ID
//mf.unitpapertaskTap.Dispose();
//mf.unitpapertaskTap.Fill(mf.DS.UnitPaperTask); #endregion #region 解决方法三采用事务处理 string oldYear = tscombYear.SelectedItem.ToString();
string newYear = tscombNewYear.SelectedItem.ToString();
string datasource = ConfigurationManager.ConnectionStrings["DBzd.Properties.Settings.baokanConnectionString"].ConnectionString.ToString();
var qUnitTask = from p in mf.DS.UnitPaperTask.AsEnumerable() where p.year == oldYear select p;
var qComnyTask = from p in mf.DS.UnitCompMoney.AsEnumerable() where p.year == oldYear select p;
//加入了详细的任务列表
using (SQLiteConnection conn = new SQLiteConnection(datasource))
{
conn.Open();
using (System.Data.SQLite.SQLiteTransaction trans = conn.BeginTransaction())
{
using (SQLiteCommand cmd = new SQLiteCommand(conn))
{
cmd.Transaction = trans;
try
{
foreach (var i in qUnitTask)
{
cmd.CommandText = @"INSERT INTO UnitPaperTask(unitid,paperid,plantnum,year) VALUES('" + i.unitid+ "','" +i.paperid + "','" + i.plantnum + "','" + newYear + "')";
cmd.ExecuteNonQuery();
} trans.Commit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
trans.Rollback(); }
}
}
} //需要加入企业任务和指定金额的任务单位
using (SQLiteConnection con = new SQLiteConnection(datasource))
{
con.Open();
using (SQLiteTransaction tran = con.BeginTransaction())
{
using (SQLiteCommand cm = new SQLiteCommand(con))
{
cm.Transaction = tran;
try
{
foreach (var i in qComnyTask)
{
cm.CommandText = @"insert into UnitCompMoney(unitid,compprices,year) values ('" + i.unitid + "','" + i.compprices + "','" + newYear + "')";
cm.ExecuteNonQuery();
}
tran.Commit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
tran.Rollback();
}
}
}
} #endregion #region 第四种方法。用SQLiteHelper实现--最后是实再不了的,因为参数只能传递一次,不能随着循环而改变值
//string oldYear = tscombYear.SelectedItem.ToString();
//string newYear = tscombNewYear.SelectedItem.ToString();
//DataTable dt = mf.DS.UnitPaperTask.Select("year='" + oldYear + "'").CopyToDataTable(); //SQLiteParameter[] Paras = new SQLiteParameter[] {
// new SQLiteParameter("@unitid",dt.Rows[0][1].ToString()),
// new SQLiteParameter("@paperid",dt.Rows[0][2].ToString()),
// new SQLiteParameter("@plantnum",dt.Rows[0][3].ToString()),
// new SQLiteParameter("@year",newYear)
//};
//string sql = "insert into UnitPaperTask(unitid,paperid,plantnum,year) VALUES ( @unitid,@paperid,@plantnum,@year)"; //int rs = SQLiteHelper.TransExecuteNonQuery(dt, sql, Paras);
//MessageBox.Show("增加新年度任务成功:"+rs.ToString()); #endregion #region 第5种方法 因为第3种是本地事处理,虽然很好的实现功能,现在想把两个表的操作放在一个分布式事务中。--这样不行SQLite没有 CommittableTransaction #endregion mf.unitpapertaskTap.Dispose();
mf.unitpapertaskTap.Fill(mf.DS.UnitPaperTask);
mf.unittaskmoeyTap.Dispose();
mf.unitpapertaskTap.Fill(mf.DS.UnitPaperTask); AddToolYear();
}
}

SQLite本地事务处理的更多相关文章

  1. sqlite本地保存数据

    package com.cesecsh.ics.database; import android.content.Context; import android.database.Cursor; im ...

  2. Android 使用SQLite本地数据库

    参考:http://blog.csdn.net/jianghuiquan/article/details/8569252 在Android平台上,集成了一个嵌入式关系型数据库—SQLite.以SQLi ...

  3. [转载]Unity3D 游戏引擎之使用C#语言建立本地数据库(SQLITE)

    以前在开发中一直使用IOS源生的数据库,通过传递消息的形式在与Unity3D中进行交互.本文我在详细说说如何使用C#语言来在MAC 操作系统下创建Unity本地数据库,我是C#控哇咔咔--- 首先你需 ...

  4. SQLite入门与分析(四)---Page Cache之事务处理(1)

    写在前面:从本章开始,将对SQLite的每个模块进行讨论.讨论的顺序按照我阅读SQLite的顺序来进行,由于项目的需要,以及时间关系,不能给出一个完整的计划,但是我会先讨论我认为比较重要的内容.本节讨 ...

  5. Xamarin.Forms 使用本地数据库之 SQLite

    前言 Xamarin.Forms支持使用SQLite数据库引擎.本文介绍了Xamarin.Forms应用程序如何读取和写入数据到使用SQLite.Net的本地SQLite数据库. 在Xamarin.F ...

  6. SQLite做为本地缓存的应用需要注意的地方

    原文:SQLite做为本地缓存的应用需要注意的地方 今天看到了园友陆敏计的一篇文章<<C#数据本地存储方案之SQLite>>, 写到了SQLite的诸多优点,尤其适应于本地数据 ...

  7. Swift使用FMDB操作SQLite

    SQLite大家都懂的.本地数据库,在移动设备上使用广泛.IOS平台上自然也少不了它.最近自己折腾一个小App的时候需要使用sqlite本地数据库,上Github搜了下IOS下对SQLite的三方封装 ...

  8. Sqlite查询时间段内的数据问题解决!

    最近搞Sqlite本地查询,需求为查询某时间段内的数据,在SQL中我们都知道为: select * from tblName where rDate Between '2008-6-10' and   ...

  9. SQLite函数详解之二

    sqlite3支持的数据类型: NULL.INTEGER.REAL.TEXT.BLOB 但是,sqlite3也支持如下的数据类型 smallint           16位整数 integer    ...

随机推荐

  1. bzoj2326: [HNOI2011]数学作业

    矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...

  2. CSS强制英文换行

    1. word-break:break-all;只对英文起作用,以字母作为换行依据 2. word-wrap:break-word; 只对英文起作用,以单词作为换行依据 3. white-space: ...

  3. 使用讯飞SDK,实现文字在线合成语音

    private SpeechSynthesizer mTts; private int isSpeaking = 0; mTts= SpeechSynthesizer.createSynthesize ...

  4. [反汇编练习] 160个CrackMe之003

    [反汇编练习] 160个CrackMe之003. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  5. I.MX6 lcd lvds hdmi bootargs

    /********************************************************************* * I.MX6 lcd lvds hdmi bootarg ...

  6. 【Java集合框架】规则集--Set

    集合: Java主要支持三种: 1.规则集(Set) 用于存储一组不重复的元素 2.线性表(List) 用于存储一个由元素构成的有序集合 3.队列(Queue) 同与数据结构中的队列,存储用先进先出的 ...

  7. 通过userAgent判断手机浏览器类型

    我们可以通过userAgent来判断,比如检测某些关键字,例如:AppleWebKit*****Mobile或AppleWebKit,需要注意的是有些浏览器的userAgent中并不包含AppleWe ...

  8. JavaEE参考示例 SpringSide 4.0 GA版杀青

    SpringSide是以Spring Framework为核心的,Pragmatic风格的JavaEE应用参考示例,是JavaEE世界中的主流技术选型,较佳实践的总结与演示. 经过漫长的7个月和6个R ...

  9. protobuf-3.0.0-beta-2 windows编译 x64/x86

    V3.0.0 beta2以及之后都是CMake 创建VS Solution,project. 因为只能创建x64的项目工程,有时候需要x86的, 只能创建完x64后,自己修改工程配置弄成x86. 创建 ...

  10. Dubbo入门实例--转载

    原文地址:http://blog.csdn.net/ruishenh/article/details/23180707?utm_source=tuicool 1.   概述 Dubbo是一个分布式服务 ...