C#缩短数据表功能

时间:2012-10-30 12:57:01

标签: c# winforms datatable

使用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;
    }

1 个答案:

答案 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));
    }
    ...
}