Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用静态数据集作为数据源_C#_Winforms_Dataset_Visual C# Express 2010 - Fatal编程技术网

C# 使用静态数据集作为数据源

C# 使用静态数据集作为数据源,c#,winforms,dataset,visual-c#-express-2010,C#,Winforms,Dataset,Visual C# Express 2010,在我的应用程序中,我有一个数据集,它保存了在我的应用程序中以不同形式使用的表。 为了能够保持表单之间的并发性,并且不必每次用户打开新表单时都从数据库获取数据,我将数据集作为程序类中的静态字段保存,如下所示: static class Program { public static CustomDataSet StockDataSet { get; private set; } [STAThread] static void Main() { St

在我的应用程序中,我有一个数据集,它保存了在我的应用程序中以不同形式使用的表。 为了能够保持表单之间的并发性,并且不必每次用户打开新表单时都从数据库获取数据,我将数据集作为程序类中的静态字段保存,如下所示:

static class Program
{
    public static CustomDataSet StockDataSet { get; private set; }

    [STAThread]
    static void Main()
    {
        StockDataSet = new Database.CustomDataSet();
        StockDataSet.InitRelations();
        StockDataSet.EnforceConstraints = false;
        StockDataSet.Categories.Fill();
        StockDataSet.Suppliers.Fill();
        StockDataSet.StockItems.Fill();
        StockDataSet.EnforceConstraints = true;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainWindow());
    }
这使得以编程方式使用数据集变得非常容易。然而,在设计时间内工作会造成挫折感。例如:;我有一个DataGridView绑定到BindingSource的表单。如果我想在设计时处理DataGridView的列,我必须让InitializeComponent中的BindingSource可以访问自定义数据集的对象

我能想到的所有解决办法都是相当丑陋的黑客。 类似于在Designer.cs中使用虚拟对象来保持设计时的愉快,然后将静态对象指定给包含虚拟对象的字段。然后重置构造函数中的所有绑定。这一定是非常糟糕的做法,对吗

所以我的问题是:是否有一种更优雅,或者至少更实用的方法? 或者,对于以多种形式使用数据集,是否有任何建议的最佳实践

编辑

存货是指存货中的存货。没有对数据进行繁重的处理,数据保存在本地服务器上的MySql数据库中

我赞同在Designer.cs中使用虚拟对象的想法,但是使用条件编译(即#if DEBUG)注释适当的部分。

在运行时显示一个数据源,在设计时显示另一个数据源一点也不难看。我认为在使用DataTables、Dataset、DataGridView和designer时,您所面临的问题相当普遍。如果您使用非常简单的主/详细表单,并且不希望超出标准行为,那么这是一个很好的工具

在您描述的场景中,您希望更改这些项的正常用法,以便在应用程序启动时预加载数据。正如您所发现的,这会导致一些问题,您现在必须自己处理。处理该问题的一部分是在运行时将数据源重置为新值。这根本不是不雅或不好的做法

然而,当您开始谈论伪造和出于性能考虑而进行的缓存时,我想知道您是否真的想要一个数据库。看起来您正在开发一个模型(使用C#对象),可以根据需要绑定、更新和序列化。虽然我不确定你的设计是否正确,但如果是我的设计(我对你的问题理解有限),我会这么做。在这一点上,数据库将不会是我项目的重要组成部分,如果有的话。我将构建表示我的表的C#对象、管理这些项的模型类和实例化模型并管理其生命周期的工厂

如果在某个时刻,我必须序列化/与数据库交互/与数据库交互,我会将其构建到模型中


关于优雅,我面临的一个更大的问题是,我将如何测试所有这些?如果我在设计时绑定,并且依赖于在运行时加载的static,那么我的设计已经阻止我执行任何类型的单元或基于类的集成测试。如果我将数据库内容分离到一个模型中,那么我就会将数据管理问题分离到一个类中,我可以将一个接口粘贴到该类中,这给了我一些可以伪造、模拟和存根的东西。

尝试使用单例设计模式

public sealed class DB
{
    private static readonly DB instance = new DB( );
    public static DB Instance { get { return instance; } }

    static DB( ) { }
    private DB( ) 
    {
        StaticData = new DataSet( );
    }

    private static DataSet StaticData;

    public DataTable GetCategoryTable( )
    {
        // check if the table has been created
        if( StaticData.Tables["Category"] == null )
        {
            // build table (or retrieve from database)
            DataTable table = new DataTable( );
            table.TableName = "Category";
            table.Columns.Add( "ID", typeof( int ) );
            table.Columns.Add( "Name", typeof( string ) );
            table.Columns.Add( "Description", typeof( string ) );

            table.Rows.Add( 1, "Beverages", "Soft drinks, coffees, teas, beers, and ales" );
            table.Rows.Add( 2, "Condiments", "Sweet and savory sauces, relishes, spreads, and seasonings" );
            table.Rows.Add( 3, "Produce", "Dried fruit and bean curd" );
            table.Rows.Add( 4, "Seafood", "Seaweed and fish" );
            table.Rows.Add( 5, "Meat/Poultry", "Prepared meats" );
            StaticData.Tables.Add(table.Copy());

        }
        return StaticData.Tables["Category"];   
    }

    public DataTable GetStatusTable( )
    {
        // check if the table has been created
        if( StaticData.Tables["Status"] == null )
        {
            // build table (or retrieve from database)
            DataTable table = new DataTable( );
            table.TableName = "Status";
            table.Columns.Add( "ID", typeof( int ) );
            table.Columns.Add( "Name", typeof( string ) );
            table.Columns.Add( "Description", typeof( string ) );

            table.Rows.Add( 1, "Active", "Active" );
            table.Rows.Add( 2, "Retired", "Retired" );
            StaticData.Tables.Add( table.Copy( ) );

        }
        return StaticData.Tables["Status"];
    }

}
像这样使用它:

    private void Form1_Load( object sender, EventArgs e )
    {
        DB db = DB.Instance;
        dataGridView1.DataSource = db.GetCategoryTable( );
        dataGridView2.DataSource = db.GetCategoryTable( );
        dataGridView3.DataSource = db.GetStatusTable( );
    }

我真的希望您不要执行任何线程操作-对于静态数据集,这将是纯粹的混乱设计器对设计器文件的外观要求太严格。它只是删除了条件语句,只是把它放在这里,并不是说它们没有条件语句