我可以在同一个窗体中重用相同的DataTable对象吗?

时间:2016-01-08 14:15:35

标签: c# sql

我是c#的新手。我正在使用Windows窗体,我从/向sql数据库读/写数据。在我的应用程序中,我多次重用连接字符串(在app.config文件中)和sqlCommand,没有问题。

如下面的代码所示,我使用的是DataTable对象。我可以在同一表单中多次重复使用相同的DataTable对象(MyDataTable)吗?这样做的最佳做法是什么?谢谢。

 MyConnection.Open();
 SqlCommand cm = new SqlCommand("SELECT * FROM table_Price");

 cm.Connection = MyConnection;

 SqlDataAdapter DataAdapter = new SqlDataAdapter(cm);
 DataTable MyDataTable = new DataTable();
 DataAdapter.Fill(MyDataTable);

2 个答案:

答案 0 :(得分:1)

只需将实例分配给一个类变量(我将原始代码放在一个方法中,以明确它是如何工作的):

private DataTable myDataTable; // create a class scoped variable

private void X()
{
    MyConnection.Open();
    SqlCommand cm = new SqlCommand("SELECT * FROM table_Price");

    cm.Connection = MyConnection;

    SqlDataAdapter dataAdapter = new SqlDataAdapter(cm);
    this.myDataTable = new DataTable(); // assign it here
    DataAdapter.Fill(this.myDataTable);
}

private void Y()
{
    // reuse this.myDataTable here
}

请阅读MSDN上的课程和班级成员:

答案 1 :(得分:0)

多次使用DataTable时,在表单项目中可以将DataTable设置为DataGridView的DataSource,例如: dataGridView1.DataSource = myDataTable。稍后我们要访问数据源,以便将DataSource转换为DataTable或具有语言扩展方法,例如。

using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace demo
{
    public static class Extensions
    {
        public static DataTable DataTable(this DataGridView sender)
        {
            return ((DataTable)sender.DataSource);
        }
    }
}

现在让我们使用它

var demo = dataGridView1.DataTable()
    .AsEnumerable()
    .Where(row => row.Field<string>("LastName") == "Payne")
    .Select(row => row).FirstOrDefault();

或者在扩展名

中使用AsEnumerable
public static class Extensions
{
    public static DataTable DataTable(this DataGridView sender)
    {
        return ((DataTable)sender.DataSource);
    }
    public static EnumerableRowCollection<DataRow> DataTableEnumerable(this DataGridView sender)
    {
        return ((DataTable)sender.DataSource).AsEnumerable();
    }
}

当然,如果不以这种方式工作,我们会使用Patrick Hofman建议的东西。

这是VS2013中的working example,而不是针对DataGridView,我将使用BindingSource,将DataSource设置为DataTable,然后BindingSource成为DataGridView的数据源,因此扩展方法现在用于BindingSource的。

public static DataTable DataTable(this BindingSource sender)
{
    return ((DataTable)sender.DataSource);
}
相关问题