【问题标题】:C# shorten datatable functionC#缩短数据表函数
【发布时间】:2012-10-30 12:57:00
【问题描述】:

使用 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 调用的集合。

到目前为止,我一直处于空白状态,所以我希望我缺少一些东西。

提前致谢

::::更新:::: 好的,到目前为止我已经设置好了......

 foreach (DataTable tbl in MyDataSet.Tables)
 {
     tbl.TableName.Equals(querys.TopVRM(""));
 }

equals 方法的方法选择也需要是动态的......有什么想法吗?

::更新(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();  

任何帮助都会很棒。

更新::

这是我从“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;
    }

【问题讨论】:

  • DataTable 的自然集合是DataSet。 msdn.microsoft.com/en-us/library/aeskbwf7.aspx
  • 确实我有一个数据集,我已经向其中添加了空白表。但不确定如何将查询添加到数据集中的每个表中。
  • 目前我有一个 foreach(myDataSet.tables 中的数据表 tbl),但它是我需要遍历的代码上下文,我不确定,语法等

标签: c# winforms datatable


【解决方案1】:

你说你已经有一个DataSet。填写所有表格的一种简单方法是使用Merge

在本例中,我在表名(DataSet 中的表名)和相应的查询函数(假设它们返回具有相似架构的 DataTable 和您的 @ 987654326@ 被命名为ds)。

Key用于从DataSet中查询到合适的DataTable,然后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));
    }
    ...
}

【讨论】:

  • 我使用了您的解决方案,发生错误,提示已存在具有相同密钥的输入,有什么想法吗?
  • 您可能在字典中添加了两次键。
  • 嗨,是的。但是我确实有一个新问题,我会更新我的问题以显示发生了什么。
  • 你的querys对象方法之一是返回null而不是DataTable(但你应该知道究竟是什么 i> 是null)。您应该能够找出它正在使用调试器并检查kvp.Key
  • 我在 sql manager 上运行了我的查询,工作正常。在我的程序中运行该方法没有错误,某些奇怪的原因该表没有值。仍然没有错误,合并时发生错误。 kvp.key 说“mantableasc” kvp.value 说“kvp.Value = {Method = {System.Data.DataTable b__8()}}”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 2015-08-15
  • 1970-01-01
  • 2017-04-14
相关资源
最近更新 更多