使用MS Visual Studio 2012 Express,使用C#.NET 4.0。
大家好,我相信这很简单。
我一直在按照我老板的要求赶一个程序,但现在事实证明我有更多的空闲时间。
所以我正在通过代码试图让它更紧凑,更清洁等。
我有这个功能......
public void RunMonth()
{
//** top 10 listings*********************//
SetTxtBox1(DateTime.Now.ToString() + " ==== END OF MONTH REPORTS starting.........\r\n");
SetTxtBox1(" **************************************************************************************\r\n");
try
{
VRMtableDESC = querys.TopVRM("DESC");
SetTxtBox1(DateTime.Now.ToString() + " ==== VRM Top has been loaded\r\n");
}
catch
{
SetTxtBox1(DateTime.Now.ToString() + " ==== VRM Top has FAILED\r\n");
}
}
“VRMtableDESC”是一个数据表,是大约18个数据表之一。对于每个数据表,运行此try语句。
现在您可以告诉我,目前每张桌子重复18次。 相反,我想循环进入表格,并用数据填充它们。
有没有办法做到这一点?据我所知,我需要某种数据集集合和query.function调用。
到目前为止,我已经打了一个空白,所以我希望有一些东西不见了。
先谢谢
:::: UPDATE :::: 好的,所以到目前为止我已经设置了这个....
foreach (DataTable tbl in MyDataSet.Tables)
{
tbl.TableName.Equals(querys.TopVRM(""));
}
equals方法在方法选择中也需要动态....任何想法?
:: UPDATE(31/10/12)::
嗨再次,我得到一个错误,常见错误“对象未发送到对象实例”
它在foreach循环中合并了。
我调试了我的查询调用,看起来很好。
var tables = new SortedDictionary<string, Func<DataTable>>()
{
{"VRMtableDESC", () => querys.TopVRM("DESC")},
{"VRMtableASC", () => querys.BotVRM("ASC")},
{"SpectableDESC", () => querys.TopSpec("DESC")},
{"SpectableASC", () => querys.botSpec("ASC")},
{"ParttableDESC", () => querys.TopPart("DESC")},
{"ParttableASC", () => querys.BotPart("ASC")},
{"MantableDESC", () => querys.TopManual("DESC")},
{"MantableASC", () => querys.BotMan("ASC")}, //why is this first to run?????
{"UsersLockedTbl",() => querys.UserLocked()},
{"NewUsersTbl", () => querys.NewUsers()},
{"VRMtotaltblTOP", () => querys.VRMtotalTOP("")},
{"PARTtotaltblTOP", () => querys.PARTtotalTOP("")},
{"SPECtotaltblTOP", () => querys.SPECtotalTOP("")},
{"MANtotaltblTOP", () => querys.MANtotalTOP("")},
{"VRMtotaltblBOT", () => querys.VRMtotalBOT("")},
{"PARTtotaltblBOT", () => querys.PARTtotalBOT("")},
{"SPECtotaltblBOT", () => querys.SPECtotalBOT("")},
{"MANtotaltblBOT", () => querys.MANtotalBOT("")},
};
foreach(var kvp in tables)
{
try
{
MyDataSet.Tables[kvp.Key].Merge(kvp.Value());//error occurs here
SetTxtBox1(String.Format("{0} ==== {1} has been Loaded\r\n", DateTime.Now.ToString(), kvp.Key));
}catch(Exception e)
{
SetTxtBox1(String.Format("{0} ==== {1} has FAILED\r\n", DateTime.Now.ToString(), kvp.Key));
MessageBox.Show("error:::" + e);
}
}
AutoRunApp();
任何帮助都会很棒。
UPDATE ::
接下来是来自“bunchofquerys”类的查询电话
public DataTable BotMan(string order)
{
SqlConnection conn = new SqlConnection(myConnString32);
SqlCommand vrm = new SqlCommand();
//BindingSource bindme = new BindingSource();
SqlDataAdapter adapt1 = new SqlDataAdapter(vrm);
// DataSet dataSet1 = new DataSet();
DataTable table1 = new DataTable();
try
{
vrm.Connection = conn;
vrm.CommandType = CommandType.StoredProcedure;
if (order.Equals("DESC"))
{
vrm.CommandText = "dbo.TopManual";
}
vrm.CommandText = "dbo.BotManual";
vrm.CommandTimeout = 360;
vrm.Parameters.AddWithValue("@OrderBy", order);
adapt1.Fill(table1);
return table1;
}
catch (Exception e)
{
MessageBox.Show("eeror::zomg::: " + e);
}
return table1;
}
答案 0 :(得分:2)
你说你已经有了DataSet
。填写所有表格的简便方法是使用Merge
。
在这个例子中,我在表名(DataSet
中的表名)和相应的查询函数之间创建了一个映射(假设它们返回一个具有类似模式的DataTable
,您的DataSet
名为ds
)。
Key
用于从DataTable
查询相应的DataSet
,然后Merge
方法用于“填充”DataTable
。
var tables = new SortedDictionary<string, Func<DataTable>>() //or use List of Tuples...
{
{"VRM_TOP", () => querys.TopVRM("DESC")},
{"FooBar_TOP", () => querys.FooBar("DESC")},
{"Something", () => querys.Something("ASC")},
};
foreach(var kvp in tables)
ds.Tables[kvp.Key].Merge(kvp.Value());
您可以反过来执行此操作并遍历您DataSet
中的每个表,并通过表TableName
获取相应的加载器函数。
现在可以轻松地将try/catch
块添加到foreach
循环中。
foreach(var kvp in tables)
{
try
{
ds.Tables[kvp.Key].Merge(kvp.Value());
SetTxtBox1(String.Format("{0} ==== {1} has ben loaded\r\n", DateTime.Now, kvp.Key));
}
...
}