C# 是否将更改从DataGridView保存回SQL数据库?

C# 是否将更改从DataGridView保存回SQL数据库?,c#,sql,winforms,datagridview,C#,Sql,Winforms,Datagridview,我试图创建一个DataGridView,它显示来自SQL数据库(GSM.sdf)的数据,并在按下保存按钮时将对DataGridView所做的更改保存回数据库。数据显示良好,但按下“保存”按钮时不会发生任何变化。我一直在遵循这条线索的首要答案: 但它不起作用。这是我的密码: namespace WindowsFormsApplication5 { public partial class Zeelot : Form { DataTable table = new

我试图创建一个DataGridView,它显示来自SQL数据库(GSM.sdf)的数据,并在按下保存按钮时将对DataGridView所做的更改保存回数据库。数据显示良好,但按下“保存”按钮时不会发生任何变化。我一直在遵循这条线索的首要答案:

但它不起作用。这是我的密码:

namespace WindowsFormsApplication5
{
    public partial class Zeelot : Form
    {
        DataTable table = new DataTable();
        SqlCeDataAdapter z;
        DataSet gSMDataSet = new DataSet();
        public Zeelot()
        {
            InitializeComponent();
        }
        private void Zeelot_Load(object sender, EventArgs e)
        {
            string b = @"Data Source =.\SQLEXPRESS;database=GSM;Integrated Security=FALSE;Connection Timeout=30;User Instance=FALSE";
            SqlCeConnection conn = new SqlCeConnection(b);
            conn.Open();
            string cd = "SELECT * FROM PhoneNumbers";
            z = new SqlCeDataAdapter(cd, conn);
            z.Fill(gSMDataSet, "PhoneNumbers");
            table = gSMDataSet.Tables[0];
            conn.Close();
            dataGridView1.DataSource = table;
        }
        private void SaveButton_Click(object sender, EventArgs e)
        {
            SqlCeCommandBuilder local_SqlCommandBuilder = new SqlCeCommandBuilder(z);
            local_SqlCommandBuilder.ConflictOption = System.Data.ConflictOption.OverwriteChanges;
            z.UpdateCommand = local_SqlCommandBuilder.GetUpdateCommand();
            z.Update(((System.Data.DataTable)this.dataGridView1.DataSource));
            ((System.Data.DataTable)this.dataGridView1.DataSource).AcceptChanges();
        }

    }
}

我相信您的问题在于将数据源强制转换为System.Data.DataTable的位置

尝试z.Update(gSMDataSet)


我也不认为您需要AcceptChanges()

我认为您的问题在于将数据源强制转换为System.Data.DataTable

尝试z.Update(gSMDataSet)

我也不相信你需要改变

  • 最后不需要在DataGridView上调用.AcceptChanges()。 AcceptChanges()将更改从DGV提交到连接的数据源(数据表)
  • 在尝试将更改提交到数据库之前,请尝试调用AcceptChanges()

  • 我认为你的问题在于你的关系。您可以手动创建和打开连接,并将其分配给DataAdapter。但是在_Load()方法中,您可以关闭连接。由于_clickeventhandler中使用的DataAdapter与_Load()方法中使用的DataAdapter相同(因此使用相同的连接)它无法向您的数据库提交任何更改,因为您已经关闭了连接。
  • 您在运行时没有得到任何异常吗

    在尝试将更改提交到数据库之前,请尝试使用断点检查连接对象的当前状态

    此外,如果要在DataAdapter中使用连接,AFAIK MS建议不要手动创建连接

    DataAdapter的构造函数可以自己创建连接

  • 最后不需要在DataGridView上调用.AcceptChanges()。 AcceptChanges()将更改从DGV提交到连接的数据源(数据表)
  • 在尝试将更改提交到数据库之前,请尝试调用AcceptChanges()

  • 我认为你的问题在于你的关系。您可以手动创建和打开连接,并将其分配给DataAdapter。但是在_Load()方法中,您可以关闭连接。由于_clickeventhandler中使用的DataAdapter与_Load()方法中使用的DataAdapter相同(因此使用相同的连接)它无法向您的数据库提交任何更改,因为您已经关闭了连接。
  • 您在运行时没有得到任何异常吗

    在尝试将更改提交到数据库之前,请尝试使用断点检查连接对象的当前状态

    此外,如果要在DataAdapter中使用连接,AFAIK MS建议不要手动创建连接

    DataAdapter的构造函数可以自己创建连接