我现在先从数据库里取出标准表到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;