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