问题描述
- datagridview如何保存到数据库时不覆盖原数据
-
我现在先从数据库里取出标准表到datagridview里,
修改完后我想将该表存到数据库里,但不覆盖原来的标准表,应该怎么做?using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; using System.Configuration; namespace NAVECOrepair { public partial class 结算单 : Form { SqlConnection conn; DataSet deptDataSet; DataSet deptDataSet1; SqlDataAdapter adapter; SqlDataAdapter adapter1; string connectString = DateTime.Now.ToString();//用于获取当前时间作为3个表的连接,精确到秒 private bool lcaBool = false; public 结算单() { InitializeComponent(); } private void 结算单_Load(object sender, EventArgs e) { LCALoad();//加载人工成本分析 MCALoad();//加载材料成本分析 } //加载人工成本分析 private void LCALoad() { conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["partialConnectString"].ToString(); SqlCommand cmd = new SqlCommand("select l_number,l_type,workHours,exaWorkHours,l_unitPrice,unitPriceTerms,exaUnitPriceTerms,connectString from LCA where connectString='0'", conn); adapter = new SqlDataAdapter(); adapter.SelectCommand = cmd; deptDataSet = new DataSet(); adapter.Fill(deptDataSet, "lca"); DataView dv = new DataView(deptDataSet.Tables["lca"]); this.dgvLCA.DataSource = dv; this.dgvLCA.Columns[0].HeaderText = "序号"; this.dgvLCA.Columns[1].HeaderText = "加工类型"; this.dgvLCA.Columns[2].HeaderText = "工时"; this.dgvLCA.Columns[3].HeaderText = "审核工时"; this.dgvLCA.Columns[4].HeaderText = "单价(元)"; this.dgvLCA.Columns[5].HeaderText = "单价项"; this.dgvLCA.Columns[6].HeaderText = "审核单价项"; this.dgvLCA.Columns[7].HeaderText = "连接串"; this.dgvLCA.Columns[0].ReadOnly = true;//设置只允许修改第3,4列的值 this.dgvLCA.Columns[1].ReadOnly = true; this.dgvLCA.Columns[2].ReadOnly = false; this.dgvLCA.Columns[3].ReadOnly = false; this.dgvLCA.Columns[4].ReadOnly = true; this.dgvLCA.Columns[5].ReadOnly = true; this.dgvLCA.Columns[6].ReadOnly = true; //this.dgvLCA.Columns[7].Visible=false;//设置连接串不显示 this.dgvLCA.Columns[0].Width = 60; for (int i = 0; i < dgvLCA.Rows.Count; i++) { dgvLCA.Rows[i].Cells[7].Value = connectString; } } //加载材料成本分析 private void MCALoad() { conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["partialConnectString"].ToString(); SqlCommand cmd1 = new SqlCommand("select m_number,m_name,m_type,unit,quantity,m_unitPrice,m_totalPrice,remark,connectString from mca", conn); adapter1 = new SqlDataAdapter(); adapter1.SelectCommand = cmd1; deptDataSet1 = new DataSet(); adapter1.Fill(deptDataSet1, "mca"); DataView dv1 = new DataView(deptDataSet1.Tables["mca"]); this.dgvMCA.DataSource = dv1; this.dgvMCA.Columns[0].HeaderText = "序号"; this.dgvMCA.Columns[1].HeaderText = "材料名称"; this.dgvMCA.Columns[2].HeaderText = "型号规格"; this.dgvMCA.Columns[3].HeaderText = "单位"; this.dgvMCA.Columns[4].HeaderText = "数量"; this.dgvMCA.Columns[5].HeaderText = "单价(元)"; this.dgvMCA.Columns[6].HeaderText = "总价(元)"; this.dgvMCA.Columns[7].HeaderText = "备注"; this.dgvMCA.Columns[8].HeaderText = "连接串"; //this.dgvMCA.Columns[8].Visible = false;//设置连接串不显示 this.dgvMCA.Columns[0].Width = 60; for (int i = 0; i < dgvMCA.Rows.Count; i++) { dgvMCA.Rows[i].Cells[8].Value=connectString; } } //当单元格内容改变时,修改单价项或者审核单价项 private void dgvLCA_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex != -1 && !lcaBool) { lcaBool = true; if (this.dgvLCA.Rows[e.RowIndex].Cells[2].Value.ToString() != "") { this.dgvLCA.Rows[e.RowIndex].Cells[5].Value = Convert.ToDecimal(this.dgvLCA.Rows[e.RowIndex].Cells[2].Value) * Convert.ToDecimal(this.dgvLCA.Rows[e.RowIndex].Cells[4].Value); } if (this.dgvLCA.Rows[e.RowIndex].Cells[3].Value.ToString() != "") { this.dgvLCA.Rows[e.RowIndex].Cells[6].Value = Convert.ToDecimal(this.dgvLCA.Rows[e.RowIndex].Cells[3].Value) * Convert.ToDecimal(this.dgvLCA.Rows[e.RowIndex].Cells[4].Value); } lcaBool = false; } } private void btnSave_Click(object sender, EventArgs e) { conn = new SqlConnection(); conn.ConnectionString = ConfigurationManager.ConnectionStrings["partialConnectString"].ToString(); } } }
解决方案
具体一点就是:
你的这个需求有两种情况,一种是将你修改后的数据写回原来的表,另一种是写到新表里。
我的解决方案有两个,都完全适用你的这两种情况,不管是写回原来的表里,还是写道新的表里,都可以用我的方案中的一种来解决
方案一:不要适用datagridview这种数据库连接控件来显示数据库的查询结果,而是使用数据库无关的网格等控件显示数据,修改完成后你想怎么写入数据库就怎么写入数据库
方案二:继续使用datagridview控件,这个控件中发生的修改将写回数据表中对应的数据来源行,你不想改变这些对应的表数据,那么比较好的方法是,让datagridview控件和你不想改变的这个表中的对应数据脱离
要实现脱离,那么最有效的方法就是把这些标准数据弄到别的表里,修改,完成后弄到你想存储它们的表里,而这需要一个中间表,把标准数据存放在里面,而数据库中的临时表就是天生干这个用的
假设你的标准表是A,要把其中的数据修改后放到表B里(这里的表B可以是表A本身),那么SELECT * INTO #BB FROM A;这个语句将建立一个新的表BB,这个SQL将新建一个表BB,并自动把表A中的标准数据弄到这个表BB里,可以说这时的表BB和表A中的数据完全一样
这个时候你用你的那些代码打开并用datagridview显示并修改表BB中的数据并保存
等你改好了,要追加这些修改了的数据到表A或表B,那么SELECT * INTO A FROM BB;这样你修改后的数据就回到表A中了,要写回B表也一样的语句,把A改成B就可以了
解决方案二:
有谁知道怎么做吗?求助!!!!!!!!!!!!
解决方案三:
查询之前先创建一个新表,将原始表数据导入其中,这些一个SQL语句可以完成,之后的左右操作都针对这个新表进行
解决方案四:
比如这样就通过查询建立了一个新表:
SELECT * INTO #临时表名 FROM 数据来源表 WHERE temp01='zhaoj';
解决方案五:
笔误了,最后写回去的语句改成 insert into b select * from bb
解决方案六:
晕死了,喝大了,改成笔误了,最后写回去的语句改成 insert into b select * from #bb;