繁体   English   中英

从datagrid识别和更新SQL记录

[英]Identify and update SQL record from datagrid

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

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

Lests说网格显示

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:我试图将其写入答案,但我的答案被删除,没有任何解释,因此我被迫在此处进行另一次编辑。

我已经尝试了您所说的内容,但似乎没有用。 我有显示数据的“数据”网格,但是当我修改现有报表并单击“保存”时,我收到一个错误:“当更新通过具有修改的行的DataRow集合时,更新需要有效的UpdateCommand。”

保存按钮代码为:

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”。

我把另一个答案留作简短参考。 请先按照示例项目中的“教程”进行操作,以便全面了解其内容以及如何使用它。 在某些地方,这听起来有些基础,但对其他使用SO的人来说却是一件好事。

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

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

2)添加数据库连接

单击“ VIEW -> Server Explorer菜单,或仅使用Ctrl + WL键盘组合。 (即按住Ctrl并先按W再按L

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

连接到数据库

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

建立连接

3)创建数据源

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

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

添加新数据源

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

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

数据库对象

4)将DataGrid添加到窗体

在“ Data Sources面板中,单击先前选择的对象之一,然后选择“ 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()

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

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

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

SELECT * FROM Table WHERE (Id = @Value)

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

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

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

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

SELECT * FROM Table WHERE (Id = ?)

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

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

没有命令生成器, Update命令将不起作用。

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

进行更改后,只需调用DataSet.AcceptChanges()您要解决的所有麻烦。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM