2016-01-21 97 views
0

我试图将InnerHtml值转换为十进制值。用户将输入的XPath到TextBox2中将InnerHtml值转换为十进制

List<Decimal> productPriceList = new List<Decimal>(); 
var priceTags = document.DocumentNode.SelectNodes(textBox2.Text);  

然后我做一个foreach循环遍历虽然发现价格,并将它们添加到一个名为productPriceList

foreach (var prices in priceTags) 
{ 
    label9.Visible = true; 
    label9.Text += prices.InnerHtml + "\n"; 
    productPriceList.Add(prices.InnerHtml); 
    label2.Visible = false; 
    label3.Visible = false; 
} 

然后,添加列表值转换成数据库

using (var con = new SqlConnection(connectionString)) 
{ 
    con.Open(); 
    using (var cmd = new SqlCommand(@"INSERT INTO OnlineProductsTemp$(CompetitorID, ProductCode, ProductName, DateCaptured) 
     VALUES(@CompetitorID, @ProductCode, @ProductName, @DateCaptured)", con)) 
    { 
     cmd.Parameters.Add("@CompetitorID", SqlDbType.Int); 
     cmd.Parameters.Add("@ProductCode", SqlDbType.VarChar); 
     cmd.Parameters.Add("@ProductName", SqlDbType.VarChar); 
     cmd.Parameters.Add("@Price", SqlDbType.Decimal); 
     cmd.Parameters.Add("@DateCaptured", SqlDbType.DateTime); 
     for (int i = 0; i < competitorList.Count; i++) 
     { 
      cmd.Parameters["@CompetitorID"].Value = competitorList[i]; 
      cmd.Parameters["@ProductCode"].Value = productCodeList[i]; 
      cmd.Parameters["@ProductName"].Value = productNameList[i]; 
      cmd.Parameters["@Price"].Value = productPriceList[i]; 
      cmd.Parameters["@DateCaptured"].Value = dateCapturedList[i]; 
      int rowsAffected = cmd.ExecuteNonQuery(); 
     } 

一切工作正常,但我似乎无法找到一种方法正确地将InnerHtml值转换为十进制类型。有没有办法实现这一点?

+0

您是否试过[Decimal.Parse](https://msdn.microsoft.com/en-us/library/system.decimal.parse(v = vs.110).aspx)? –

+0

我收到错误**索引超出范围。当我添加一个'productPriceList.Add(Decimal.Parse(prices.InnerHtml));'到foreach循环时,它必须是非负的并且小于集合**的大小。将数据添加到数据库时发生此错误,并且列表中有0个元素 – TeaAnyOne

+0

然后很明显,您应该检查在列表中是否有某些内容,特别是当您遍历其他数组/列表时。 –

回答

1

根据你的价值观是来自内部HTML,你可以做这样的事情

using (var con = new SqlConnection(connectionString)) 
{ 
    con.Open(); 
    using (var cmd = new SqlCommand(@"INSERT INTO  OnlineProductsTemp$(CompetitorID, ProductCode, ProductName, DateCaptured) 
    VALUES(@CompetitorID, @ProductCode, @ProductName, @DateCaptured)", con)) 
    { 
     cmd.Parameters.Add("@CompetitorID", SqlDbType.Int); 
     cmd.Parameters.Add("@ProductCode", SqlDbType.VarChar); 
     cmd.Parameters.Add("@ProductName", SqlDbType.VarChar); 
     cmd.Parameters.Add("@Price", SqlDbType.Decimal); 
     cmd.Parameters.Add("@DateCaptured", SqlDbType.DateTime); 
     for (int i = 0; i < competitorList.Count; i++) 
     { 
      cmd.Parameters["@CompetitorID"].Value = competitorList[i]; 
      cmd.Parameters["@ProductCode"].Value = productCodeList[i]; 
      cmd.Parameters["@ProductName"].Value = productNameList[i]; 
      cmd.Parameters["@Price"].Value = productPriceList[i]; 
      cmd.Parameters["@DateCaptured"].Value = dateCapturedList[i]; 
      int rowsAffected = cmd.ExecuteNonQuery(); // also the variable rowsAffected is not visible outside the scope of the for loop 
     } 
    } 
} 

更新: 你应该,那么,转换值,将其添加在列表中,像这样之前:

foreach (var prices in priceTags) 
{ 
    label9.Visible = true; 
    label9.Text += prices.InnerHtml + "\n"; 
    productPriceList.Add(Decimal.Parse(prices.InnerHtml, <cultureInfoHere>)); 
    label2.Visible = false; 
    label3.Visible = false; 
} 

通过这样做,您不必更改列表类型。