3个具有相同名称的字符串 - 需要存储在datatable中的不同列中

时间:2016-03-08 21:01:02

标签: c# database

 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个值)进入这些行

2 个答案:

答案 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();