1

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

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

内容本身就是购物网站上的订单详情。我首先运行查询以计算并返回需要发送给客户端的下一个订单 ID,然后使用此订单 ID 从关系数据库中的各种表。

无论我采取哪种方式,这都是一团糟。我最终得到了大量的方法,为我需要的每条数据定义了一个变量,每个变量都等于我拥有的对我的 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 应用程序中收集大量数据的正确方法是什么?

4

2 回答 2

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';
于 2012-06-27T16:58:37.073 回答
1

你真的没有充分利用面向对象的编程。 从您的示例中很难推断出您的表之间的关系,但是Chris Lively 在推断您的桌子之间的关系方面做得很好,您将其描述为来自购物网站的订单详细信息。当然,这意味着一些一致的关系。

我会这样解决问题:

  • 开发最有效的整合查询以获得您需要的数据。
  • 对于每个查询,创建一个类。构建您的类以匹配您的数据(“五个基本组,每个组包含 3 个子组”)。
  • 遵循良好的 OOP 原则,并在该类中隐藏一个类所需的复杂性,如果这是唯一需要它的地方。
  • 为变量和类使用更具描述性的名称。

这应该会产生更具可读性、可维护性和“整洁”的代码。

于 2012-06-27T17:04:25.720 回答