我的数据库有这样的字段:ID(nvarchar), 开始日期(日期), 结束日期(日期), 状态(位)
我目前正在从网站解析 HTML,以便比较 2 个值(1 个来自我的本地数据库,其他来自网站)以确定它们是否相同。如果它们是相同的值 - 完美。但是,如果日期或状态相差超过 7 天或状态显示非活动而不是活动(反之亦然),我希望它"添加到最终报告",在它遍历所有值后,在桌面上存储一个报告.txt文件(不确定仍然)
SqlConnection conn = new SqlConnection(Properties.Settings.Default.LenovoWarrantyConnectionString);
conn.Open();
ArrayList lenovolist = new ArrayList();
SqlCommand myCommand = conn.CreateCommand();
myCommand.CommandText = ("SELECT SerialNumber from Warranty");
SqlDataReader myReader = myCommand.ExecuteReader();
int count = myReader.FieldCount;
while (myReader.Read())
{
for (int i = 0; i < count; i++)
{
//Loop through Serial Numbers
string result = myReader.GetValue(i).ToString();
//Iterate through Lenovo's Serial Checker 1 by 1
webBrowser1.Document.GetElementById("serialCode").Focus();
webBrowser1.Document.GetElementById("serialCode").InnerText = result;
webBrowser1.Document.GetElementById("warrantySubmit").InvokeMember("Click");
Thread.Sleep(500);
MessageBox.Show("Script Completed");
//Get System Summary Info
foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("div"))
if (el.GetAttribute("className") == "fluid-row firstfluid")
{
var record = el.InnerText;
lenovolist.Add(record);
//MessageBox.Show(record, "System Summary");
}
//Get Base Warranty, Warranty Upgrade, and Priority Support
foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("div"))
if (el.GetAttribute("className") == "fluid-row Borderfluid")
{
var record1 = el.InnerText;
lenovolist.Add(record1);
MessageBox.Show(record1, "Base Warranty, Warranty Upgrade, Priority Support");
}
}
}
foreach (var items in lenovolist)
{
MessageBox.Show(items.ToString());
}
我在数据库中有大约 300~ 行。
起初我想过将解析的 HTML 存储在数组列表中以便与数据库进行比较 - 我现在需要将解析的信息存储到 db 中(除非日期/状态不同)
提前感谢您在这方面的任何帮助
我认为这里有一个与如何处理数据有关的混乱:
1)数据属于数据层(在您的情况下为MySQL服务器),并且几乎总是应该只存储数据,而不是与表示相关的信息
2)HTML代码属于表示层(馈送到浏览器显示信息)
好的,理论够多了。在您的情况下:
1) 为从 Web 获取的数据定义一个表。例如
网站数据
ProductId INT
TheDate DATE
SerialCode VARCHAR(128)
2) 解析 Html 文件并在插入到 WebData 表之前转换数据。Date可以使用DateTime.Parse,DateTime.TryParse或确切的对应物 - DateTime.ParseExact 或DateTime.TryParseExact (我推荐最后一个)进行解析。
3)您可以发出如下所示的选择(DateDiff用于检查该时间跨度)
SELECT (CASE WHEN DATEDIFF(W.TheDate, P.EndDate) > 7 THEN 0 ELSE 1 END) AS IsActive, <other info here>
FROM Product P
INNER JOIN WebData W ON W.ProductId = P.ProductId
当然,这可以转换为更新以维护Status
。