SqlConnection conn = new SqlConnection(Properties.Settings.Default.xConnectionString);
conn.Open();
SqlCommand myCommand = conn.CreateCommand();
myCommand.CommandText = ("SELECT SerialNumber from Warranty");
SqlDataReader myReader = myCommand.ExecuteReader();
int count = myReader.FieldCount;
//Loop through webbrowser form
while (myReader.Read())
{
for (int i = 0; i < count; i++)
{
//Loop through Serial Numbers
string result = myReader.GetValue(i).ToString();
//Iterate through x'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("TEST");
//Get Base Warranty, Warranty Upgrade, and Priority Support
foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("div"))
if (el.GetAttribute("className") == "fluid-row Borderfluid")
{
string record = el.InnerText;
//if record is the string to parse
var result1 = parseString(record);
//var result_string = string.Join("", result1.ConvertAll(r => string.Format("{0}\n{1}\n{2}", r)).ToArray());
var strStartDate = string.Join("", result1.ConvertAll(r => string.Format("{0}", r)).ToArray());
var strEndDate = string.Join("", result1.ConvertAll(r => string.Format("{1}", r)).ToArray());
var strStatus = string.Join("", result1.ConvertAll(r => string.Format("{2}", r)).ToArray());
Thread.Sleep(500);
MessageBox.Show(strStartDate);
MessageBox.Show(strEndDate);
MessageBox.Show(strStatus);
}
}
}
我目前的问题是这个html页面中有3个div,其中有&#34;流体行Borderfluid&#34; - 每个div包含我想要的3件事 - &#34;开始日期,结束日期和状态&#34;
因此,每个循环我得到9个值,但只存储到3个(strStartDate,strEndDate,strStatus)如果我正在做一个MessageBox.Show,那就没问题,但我只是这样做来测试结果。
我想将所有9个值存储到数据表中的9个单独列中。有没有办法我可以说strStartDate放在这里的第一个结果,strStartDate的第二个结果放在这里,strStartDate的第三个结果放在这里&#39;
我不知道这是否存在,或者我认为这一切都是错的。非常感谢帮助。
更新:我的DataTable结构
我正在使用AccessDB并且在一行中提供了一些细节: OriginalXStartDate OriginalXEndDate OriginalXStatus OriginalYStartDate OriginalYEndDate OriginalYStatus OriginalZStartDate OriginalZEndDate OriginalZStatus
所以我试图让strStartDate(由于3个html div而有3个值)进入这些行
答案 0 :(得分:1)
简短的回答是“是的”。将信息存储到数据库中时即可完成。我不知道你正在使用什么数据库,或者你的表设计,所以我只能专注于以稍后可以引用的格式获取值。
例如,您可以创建一个MyClass类来存储div中的信息。我保持字符串数据类型,因为这是你的例子,但我会转换为DateTime并存储该格式而不是字符串。由你决定。
public class MyClass
{
public MyClass(string startDate, string endDate, string status)
{
this.startDate = startDate;
this.endDate = endDate;
this.status = status;
}
public string startDate { get; set; }
public string endDate { get; set; }
public string status { get; set; }
}
在你的代码中(在foreach循环之外),使用MyClass类创建List的实例。
List<MyClass> myList = new List<MyClass>();
执行MessageBox.Show后,将新项添加到列表中:
myList.Add(new MyClass(strStartDate, strEndDate, strStatus);
循环之后,你有一个包含三个实例的列表,每个实例都有三个值。
现在,使用您的值转到数据库。我不知道你是否计划一个有三行的表,每行有三列,或者一个有九列的表,但无论哪种方式,你都可以得到你想要存储的数据。
答案 1 :(得分:1)
您有以下表/数据结构(如您所述):
OriginalXStartDate, OriginalXEndDate, OriginalXStatus, OriginalYStartDate, OriginalYEndDate, OriginalYStatus, OriginalZStartDate, OriginalZEndDate, OriginalZStatus
正如Mark West所提到的,你可以使用一个类来表示这些列。
只需编写要插入的SQL即可。我不熟悉AccessDB,但我认为你可以对它执行SQL。
string insertSql = "INSERT INTO dbo.<TABLE>(OriginalXStartDate, OriginalXEndDate, OriginalXStatus, OriginalYStartDate, OriginalYEndDate, OriginalYStatus, OriginalZStartDate, OriginalZEndDate, OriginalZStatus) VALUES(@OriginalXStartDate, @OriginalXEndDate, @OriginalXStatus, @OriginalYStartDate, @OriginalYEndDate, @OriginalYStatus, @OriginalZStartDate, @OriginalZEndDate, @OriginalZStatus)";
// Use Correct Data Types/Lengths
SqlCommand cmd = new SqlCommand(insertSql, <dbConnection>);
cmd.Parameters.Add("@OriginalXStartDate", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@OriginalXEndDate", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@OriginalXStatus", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@OriginalYStartDate", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@OriginalYEndDate", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@OriginalYStatus", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@OriginalZStartDate", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@OriginalZEndDate", SqlDbType.VarChar, 100);
cmd.Parameters.Add("@OriginalZStatus", SqlDbType.VarChar, 100);
// From Mark West's solution, using a class (MyClass for example, stored in List<MyClass> myList
// Could use variables, loop, do error checking etc. I'm not for the sake of time
cmd.Parameters["@OriginalXStartDate"].Value = myList[0].StartDate;
cmd.Parameters["@OriginalXEndDate"].Value = myList[0].EndDate;
cmd.Parameters["@OriginalXStatus"].Value = myList[0].Status;
cmd.Parameters["@OriginalYStartDate"].Value = myList[1].StartDate;
cmd.Parameters["@OriginalYEndDate"].Value = myList[1].EndDate;
cmd.Parameters["@OriginalYStatus"].Value = myList[1].Status;
cmd.Parameters["@OriginalZStartDate"].Value = myList[2].StartDate;
cmd.Parameters["@OriginalZEndDate"].Value = myList[2].EndDate;
cmd.Parameters["@OriginalZStatus"].Value = myList[2].Status;
cmd.ExecuteNonQuery();