hong34210
2015-04-18 08:19
采纳率: 97%
浏览 2.1k
已采纳

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();

        }
    }
}

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • 宝龙哥 2015-04-18 12:02
    已采纳

    具体一点就是:

    你的这个需求有两种情况,一种是将你修改后的数据写回原来的表,另一种是写到新表里。

    我的解决方案有两个,都完全适用你的这两种情况,不管是写回原来的表里,还是写道新的表里,都可以用我的方案中的一种来解决

    方案一:不要适用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就可以了

    已采纳该答案
    打赏 评论
  • hong34210 2015-04-18 08:46

    有谁知道怎么做吗?求助!!!!!!!!!!!!

    打赏 评论
  • 宝龙哥 2015-04-18 08:49

    查询之前先创建一个新表,将原始表数据导入其中,这些一个SQL语句可以完成,之后的左右操作都针对这个新表进行

    打赏 评论
  • 宝龙哥 2015-04-18 08:56

    比如这样就通过查询建立了一个新表:

    SELECT * INTO #临时表名 FROM 数据来源表 WHERE temp01='zhaoj';

    打赏 评论
  • 宝龙哥 2015-04-18 12:08

    笔误了,最后写回去的语句改成 insert into b select * from bb

    打赏 评论
  • 宝龙哥 2015-04-18 12:08

    晕死了,喝大了,改成笔误了,最后写回去的语句改成 insert into b select * from #bb;

    打赏 评论

相关推荐 更多相似问题