从datagrid识别和更新SQL记录

时间:2014-03-14 11:06:45

标签: c# sql-server visual-studio-2012

我在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();部分,因为如果我使用按钮我如何调用数据集?因为数据集在代码的另一部分。

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

我已经尝试了你所说的但它似乎没有用。我有数据网格显示数据,但是当我修改现有报告并单击SAVE时,我收到一个错误:"更新需要一个有效的UpdateCommand,当传递带有修改行的DataRow集合时。"

保存按钮代码为:

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

}

填充函数是:

 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"

3 个答案:

答案 0 :(得分:3)

我留下了另一个答案供参考。请按照这个"教程"在之前的示例项目中,您可以全面了解它是什么以及如何使用它。在某些地方听起来可能有些基本但对使用SO的其他人有好处。

1)创建一个新的WinFom应用程序

在Visual Studio上,单击FILE -> New -> Project。选择Windows Forms Application,为其命名或保留默认设置,然后点击OK

2)添加数据库连接

单击VIEW -> Server Explorer菜单或只需使用 Ctrl + W L 键盘组合。 (即持有 Ctrl 并按 W 然后 L

在打开的面板上,单击Connect to Database按钮。

Connect to Database

填写必填字段,测试连接并点击OK

Create connection

3)创建数据源

点击VIEW -> Other Windows -> Data Sources菜单或只使用 Shift + Alt + D 键盘组合。

在打开的面板上,单击Add New Data Source按钮。

Add New Data Source

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

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

Database objects

4)将DataGrid添加到表单

Data Sources面板中,点击您之前选择的其中一个对象,然后选择DataGridView

DataGridView

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

Generated Controls

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

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

6)创建参数化查询 - 编辑

您可以在海关查询中使用给定数据集的参数。您可以在您的情况下使用以下查询:

SELECT * FROM Table WHERE (Id = @Value)

ADO.NET将生成一个新的FillBy()方法,您可以使用该方法代替Fill()方法中的常规Form_Load。生成的方法将具有类似于:

的签名
public virtual int FillBy(TestDataSet.TableDataTable dataTable, int Value)

请注意,输入参数的数量将扩展您拥有的查询参数的数量。该类型将匹配目标数据库中字段的类型(对于Id而言为int

@Value对SQL Server有效。如果您正在使用其他DBMS,请使用?

SELECT * FROM Table WHERE (Id = ?)

答案 1 :(得分:1)

我设法解决了这个声明的公共变量:

    private string variabila;
    private int varsta;
    private DataSet set = new DataSet("cucu");
    private SqlDataAdapter sda;
    private SqlCommandBuilder cmdBuilder;

使用SQLCommandBuilder进行更新:

    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"]);
}

如果没有Command Builder,Update命令就无法运行。

答案 2 :(得分:0)

如果您还没有使用DataSet,则应该考虑使用DataSet.AcceptChanges()。您可以在DataGrid中将DataSet定义为数据源,并定义运行以显示所需数据所需的查询。

在您进行更改后,需要调用{{1}},这将解决您所询问的所有麻烦。

以下是有关如何使用DataSet的一些有用文档: