我在Visual Studio 2010中使用C#的新手,所以我的知识相当有限。 我希望在SQL Server 2008中创建一个运行并导出多个存储过程的程序 - 同时还有一个很好的接口。 我不确定的是如何做得最好?
我在想我想要一个可能有树视图和datagridview的表单,然后执行存储过程。只使用一个查询就可以正常工作 - 但我的问题是如何通过多个查询最好地完成此操作?我不想为每个存储过程提供不同的datagridviews(我有很多)。我希望能够在我的树视图中选择不同的存储过程,并使datagridview中的数据更改,而不必每次都运行存储过程。其中一些是非常耗费时间(> 1分钟)。所以我问我要问的是,如果我能以某种方式将所有数据一次加载到我的程序中? 我可以获取一个数据集来容纳多个表 - 或者我是否必须为我的所有存储过程创建不同的数据集?
答案 0 :(得分:1)
不是一次将所有数据加载到程序中,而是在第一次运行时缓存查询结果。这会阻止人们等待所有内容加载,以便他们可以查看一个数据集。
当前您描述的场景是,当您单击树视图中的特定项时,将运行相关的SQL并将结果集合绑定到您的datagridview,从而消除以前的所有数据。
缓存的做法会插入一个get-if-I-don-t-already-it-layer和一个存储方法。像这样:
public class MyResultClass
{
public string Column1 { get; set; }
public string Column2 { get; set; }
}
private static readonly Dictionary<string, IEnumerable<MyResultClass>>
CachedResults = new Dictionary<string, IEnumerable<MyResultClass>>();
protected void OnTreeViewSelectionChanged(object sender, EventArgs e)
{
// I'm not overly familar with the treeview off the top of my head,
// so get selectedValue however you would normally.
var selectedValue = ????;
IEnumerable<MyResultClass> results;
// Try to find the already cached results and if false, load them
if (!CachedResults.TryGet(selectedValue, out results))
{
// GetResults should use your current methodology for getting the results
results = GetResults(selectedValue);
CachedResults.Add(selectedValue, results);
}
myGridView.DataSource = results;
}
注意:如果这是一个Web应用程序而不是winforms,那么您需要使用ConcurrentDictionary而不是Dictionary来使这个模式线程安全。