我正在编写一个程序,它从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应用程序中收集大量数据的正确方法是什么?
答案 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在推断表格之间的关系方面表现出色,并且您将其描述为购物网站的订单详细信息。当然,这意味着一些一致的关系。
我会这样解决问题:
这应该会产生更易读,可维护,“整洁”的代码。