C# 从datagrid中识别和更新SQL记录

C# 从datagrid中识别和更新SQL记录,c#,sql-server,visual-studio-2012,C#,Sql Server,Visual Studio 2012,我在C#Visual Studio 2012中有一个简单的应用程序,其中包含一个显示SQL表记录的数据网格。 我添加了文本框和组合框来添加新记录,效果很好 我试图做的是直接在数据网格中更新现有记录。我有更新查询按钮,但我有一个问题。如何识别网格中已修改的记录 莱斯特说网格显示 ID Name Age Gender ---- -------- ---- -------- 1 Steven 21 M 2 Dan 34 M 此数据通过以下方式显示: S

我在C#Visual Studio 2012中有一个简单的应用程序,其中包含一个显示SQL表记录的数据网格。 我添加了文本框和组合框来添加新记录,效果很好

我试图做的是直接在数据网格中更新现有记录。我有更新查询按钮,但我有一个问题。如何识别网格中已修改的记录

莱斯特说网格显示

ID   Name     Age  Gender
---- -------- ---- --------
1    Steven   21   M
2    Dan      34   M
此数据通过以下方式显示:

SELECT * FROM table.
我进入网格,将第二条记录的年龄从43岁修改为36岁。 要保存它,我需要运行一个更新查询,但是我如何判断修改的ID是2?我有什么办法可以做到这一点吗?还是其他方式

编辑:

它的工作原理如下:更新数据网格:

SqlConnection con = new SqlConnection("user id=testuser12;" +
                                      "password=Reporting11#;Data Source=SERVER;" +
                                   // "Trusted_Connection=yes;" +
                                      "Initial Catalog=Partner_database; " +
                                      "connection timeout=30");
SqlCommand command = new SqlCommand("select * from [dbo].[Test_table]", con)
SqlDataAdapter sda = new SqlDataAdapter(command);
DataSet set = new DataSet("cucu");
sda.Fill(set,"cucu");
dataGridView1.DataSource = set;
dataGridView1.DataMember = "cucu";
我现在正在测试如何执行DataSet.AcceptChanges();部分,因为如果我使用按钮,如何调用数据集?因为数据集位于代码的另一部分

编辑2:我试着把这个写进一个答案,但是我的答案被删除了,没有任何解释,所以我不得不在这里再做一次编辑

我试过你说的话,但似乎不管用。我有显示数据的数据网格,但当我修改现有报告并单击“保存”时,我得到一个错误:“当通过修改的行传递DataRow集合时,更新需要有效的UpdateCommand。”

保存按钮代码为:

private void test_tableBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
    this.Validate();
    this.test_tableBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.partner_databaseDataSet);

}
fillby函数是:

 private void fillByToolStripButton_Click(object sender, EventArgs e)
{
    try
    {
        this.test_tableTableAdapter.FillBy(this.partner_databaseDataSet.Test_table, valueToolStripTextBox.Text);
    }
    catch (System.Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }

}
保存时,错误显示在下一行:

this.tableAdapterManager.UpdateAll(this.partner_databaseDataSet);

是否需要修改“保存”按钮正在执行的操作?没有“.AcceptChanges”。

如果您还没有使用数据集,您可能应该考虑使用
数据集。您可以将数据集定义为DataGrid中的数据源,并定义需要运行以显示所需数据的查询

进行更改后,只需调用
DataSet.AcceptChanges()
,它将解决您所询问的所有问题

以下是一些关于如何使用数据集的有用文档:

  • (请看最后的例子)
  • (通常与数据集结合使用)

如果您还没有使用数据集,您可能应该考虑使用数据集。您可以将数据集定义为DataGrid中的数据源,并定义需要运行以显示所需数据的查询

进行更改后,只需调用
DataSet.AcceptChanges()
,它将解决您所询问的所有问题

以下是一些关于如何使用数据集的有用文档:

  • (请看最后的例子)
  • (通常与数据集结合使用)

    • 我留下了另一个答案供参考。请遵循这个“教程”的一个样本项目之前,这样你就可以得到什么是完整的图片,以及如何使用它。在某些地方,这听起来可能有点基本,但对其他使用它的人来说是有好处的

      1) 创建一个新的WinFom应用程序 在Visual Studio上,单击
      文件->新建->项目
      。选择Windows窗体应用程序
,给它一个名称或保留默认名称,然后点击
确定

2) 添加数据库连接 单击
视图->服务器资源管理器
菜单或简单地使用Ctrl+W,L组合键盘。(即按住Ctrl键并在L键时按W键)

在打开的面板上,单击
连接到数据库
按钮

填写必填字段,测试连接,然后单击
OK

3) 创建一个数据源 单击
视图->其他窗口->数据源
菜单,或简单地使用Shift+Alt+D键盘组合

在打开的面板上,单击添加新数据源按钮

在第一个屏幕中选择
Database
,在第二个屏幕中选择
Dataset
,然后点击
Next
。从下拉列表中选择刚创建的数据连接,然后再次单击两次
Next

在数据库对象选择屏幕中,选择要包含在数据集中的表,然后单击
Finish

4) 将DataGrid添加到表单中 在
数据源
面板中,单击先前选择的一个对象,然后选择
DataGridView

接下来,将对象名称拖放到表单中。将生成一些控件(包括数据网格)。将使用所需的连接、绑定和数据源设置数据网格

5) 浏览代码 尝试浏览生成的代码和控件属性,以更好地了解解决方案。请注意表单中生成的以下代码行:

private void Form1_Load(object sender, EventArgs e)
{
  // TODO: This line of code loads data into the 'testDataSet.Language' table. You can move, or remove it, as needed.
  this.languageTableAdapter.Fill(this.testDataSet.Language);
}

private void languageBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
  this.Validate();
  this.languageBindingSource.EndEdit();
  this.tableAdapterManager.UpdateAll(this.testDataSet);

}
加载表单时,为对象生成了一个
TableAdapter
,并用
testDataSet
中的数据填充

Save
按钮(小软盘图标)正在调用
tableAdapterManager.UpdateAll(this.testDataSet)
,它将隐式调用
DataSet.AcceptChanges()

请注意,您可以通过更改选择查询(通过单击上一屏幕中的
添加查询
)缩小数据集的范围

6) 创建参数化查询-编辑 可以在给定数据集的海关查询中使用参数。您可以在案例中使用以下查询:

SELECT * FROM Table WHERE (Id = @Value)
ADO.NET将生成一个新的
FillBy()
方法,您可以使用该方法代替
Form\u Load
方法中的常规
Fill()
。生成的方法的签名类似于:

public virtual int FillBy(TestDataSet.TableDataTable dataTable, int Value)
请注意,输入参数的数量将根据您拥有的查询参数的数量进行扩展。该类型将与目标数据库中字段的类型相匹配(Id的hete
int

@Value
对SQL Server有效。如果您正在使用另一个DBMS,请使用

SELECT * FROM Table WHERE (Id = ?)

我把另一个答案留作参考。请遵循此“教程A”
    private string variabila;
    private int varsta;
    private DataSet set = new DataSet("cucu");
    private SqlDataAdapter sda;
    private SqlCommandBuilder cmdBuilder;
    private void button1_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection("Data Source=SERVER;" +
                                          "Initial Catalog=Partner_database;" +
                                          "Integrated Security=True");
    SqlCommand command = new SqlCommand("select * from [dbo].[Test_table]", con);

    sda = new SqlDataAdapter(command);
    sda.AcceptChangesDuringFill = true;
    sda.AcceptChangesDuringUpdate = true;
    set.Clear(); //just to make sure i have a clear set
    cmdBuilder = new SqlCommandBuilder(sda); //use the command builder to create the commands
    sda.Fill(set_date,"cucu1");
    dataGridView1.DataSource = set_date;
    dataGridView1.DataMember = "cucu1";
}
private void button4_Click(object sender, EventArgs e)
{
      sda.Update(set.Tables["cucu"]);
}