在.Net中收集大量数据的最简洁方法是什么?

时间:2012-06-27 16:51:49

标签: c# mysql standards

我正在编写一个程序,它从MySQL数据库中收集大量单独的数据,并将这些数据序列化为XML文档。

我的XML文档有五个基本组,每组包含3个子组,我总共收集了大约100个数据。

内容本身是购物网站上的订单详情。我首先运行一个查询来计算并返回需要发送到客户端的下一个订单ID,然后使用此订单ID来回送每个数据(地址行1,地址行2,购买的项目等)关系数据库中的各种表。

无论我采用哪种方式,这都是凌乱的。我最终得到了大量的方法,为我需要的每个数据定义了一个变量,每个变量等于我对MySQL数据库运行查询的方法的返回值。一些数据需要额外的逻辑应用(例如,某些数据需要清理,某些日期需要格式化XML的某种方式)。

几点

  • 我没有创建数据库结构或购物网站,我无法改变它
  • 我有一个正在运行的工作程序。这是我几个月前写的一个程序,我要回去改进

下面是一些示例代码:

string valueOne = myMethod("SELECT `valueOne` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueTwo = myMethod("SELECT `valueTwo` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueThree = myMethod("SELECT `valueThree` FROM `tableTwo` WHERE `OrderID` = '12345';");
int valueFour = Convert.ToInt32(myMethod("SELECT `valueFour` FROM `tableThree` WHERE `OrderID` = '12345';"));
string valueFive = myMethod("SELECT `valueFive` FROM `tableThree` WHERE `OrderID` = '12345';");

if(valueFive == "FooBar")
{
    //Do Stuff
}

string valueSix = myMethod("SELECT `valueSix` FROM `tableThree` WHERE `OrderID` = '12345';");
DateTime valueSeven = DateTime.Parse(myMethod("SELECT `valueSeven` FROM `tableFour` WHERE `OrderID` = '12345';"));
string valueEight = myMethod("SELECT `valueEight` FROM `tableFive` WHERE `OrderID` = '12345';");
string valueNine = String.Format("QWERTY - {0} - YTREWQ", myMethod("SELECT `valueNine` FROM `tableSix` WHERE `OrderID` = '12345';"));
string valueTen = myMethod("SELECT `valueTen` FROM `tableSeven` WHERE `OrderID` = '12345';");

        MyClass fooBar = new MyClass()
        {
            valueOne = valueOne,
            valueTwo = valueTwo,
            valueThree = valueThree,
            valueFour = valueFour,
            valueFive = valueFive,
            valueSix = valueSix,
            valueSeven = valueSeven,
            mySecondClass = new MySecondClass()
            {
                valueEight = valueEight,
                valueNine = valueNine,
                myThirdClass = new MyThirdClass() { valueTen = valueTen }
            }
        };

SerializeToXML<MyClass>(fooBar);

想象一下,但是有更多的数据。是的它有效,但它不整洁,难以维护,更一般地说,不是很好。

所以我的问题是,在.Net应用程序中收集大量数据的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

直接看起来你可以将很多查询合并到一个查询中。例如,您有以下内容:

string valueOne = myMethod("SELECT `valueOne` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueTwo = myMethod("SELECT `valueTwo` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueThree = myMethod("SELECT `valueThree` FROM `tableTwo` WHERE `OrderID` = '12345';");
int valueFour = Convert.ToInt32(myMethod("SELECT `valueFour` FROM `tableThree` WHERE `OrderID` = '12345';"));
string valueFive = myMethod("SELECT `valueFive` FROM `tableThree` WHERE `OrderID` = '12345';");

我会删除那些单独的查询并使用单个查询:

SELECT one.valueOne, one.valueTwo, two.valueThree, three.valueFour, three.valueFive
  FROM tableOne one
    INNER JOIN tableTwo two on (two.OrderId = one.OrderId)
    INNER JOIN tableThree three on (three.OrderId = one.OrderId)
  WHERE one.OrderId = '12345';

坦率地说,看起来你可以对其他人做同样的事情。

另外,我不完全确定myMethod做了什么,但它确实看起来只是在查询上返回一个标量值。摆脱它并将其替换为将为您提供DataTable或对象集合的东西。这样,您可以一次性获取所需的所有数据。

注意:如果您希望这些表中的每一个都具有基于OrderId的值,则内部联接可以工作。如果他们不这样做,那么从外部联接开始,该表将始终具有现有记录。例如:

SELECT one.valueOne, one.valueTwo, two.valueThree, three.valueFour, three.valueFive
      FROM orders o
        LEFT OUTER JOIN tableOne one on (one.OrderId = o.OrderId)
        LEFT OUTER JOIN tableTwo two on (two.OrderId = o.OrderId)
        LEFT OUTER JOIN tableThree three on (three.OrderId = o.OrderId)
      WHERE o.OrderId = '12345';

答案 1 :(得分:1)

你真的在利用面向对象的编程。 从您的示例中很难推断出表格之间的关系,但 Chris Lively在推断表格之间的关系方面表现出色,并且您将其描述为购物网站的订单详细信息。当然,这意味着一些一致的关系。

我会这样解决问题:

  • 开发最有效的整合查询以获取您的数据 需要。
  • 对于每个查询,创建一个类。将您的课程结构化 匹配您的数据(“五个基本组,每个组包含3个 小组“)。
  • 遵循良好的OOP原则并隐藏复杂性 该类中的一个类所要求的,如果它是唯一的位置 需要。
  • 为变量使用更多描述性名称 类。

这应该会产生更易读,可维护,“整洁”的代码。