2017-09-06 67 views
0

好吧,所以我试图从SQL数据库中获取18个“价格”,然后将它们设置在本地数组中。到目前为止,我已经在数据检索这一逻辑:当解析整数时,输入字符串“格式不正确”

private void dbPrices() 
{ 
    string myConnectionString; 

    myConnectionString = "server=127.0.0.1;uid=root;" + 
     "pwd=;database=phvpos"; 

    try 
    { 
     conn = new MySql.Data.MySqlClient.MySqlConnection(); 
     conn.ConnectionString = myConnectionString; 
     conn.Open(); 
    } 
    catch (MySql.Data.MySqlClient.MySqlException ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

    for (int i = 1; i < 19; i++) 
    { 
     MySqlCommand cmd = conn.CreateCommand(); 
     cmd.CommandText = "SELECT price from products where id = '" + i + "'"; 

     MySqlDataReader reader = cmd.ExecuteReader(); 

     while (reader.Read()) 
     { 
      pr[i] = reader.ToString(); 
      prods[i] = int.Parse(pr[i]); 
     } 
    } 
} 

而且在得到的总量此逻辑:

private void btnTotal_Click(object sender, EventArgs e) 
{ 
    dbPrices(); 

    itemcost[0] = Convert.ToInt32(txtRice.Text) * prods[0]; 
    itemcost[1] = Convert.ToInt32(txtAdobo.Text) * prods[1]; 
    itemcost[2] = Convert.ToInt32(txtIgado.Text) * prods[2]; 
    itemcost[3] = Convert.ToInt32(txtSisig.Text) * prods[3]; 
    ... 
    itemcost[18] = itemcost[0] + itemcost[1] + itemcost[2] + itemcost[3] + itemcost[4] + itemcost[5] 
     + itemcost[6] + itemcost[7] + itemcost[8] + itemcost[9] + itemcost[10] 
     + itemcost[11] + itemcost[12] + itemcost[13] + itemcost[14] + itemcost[15] 
     + itemcost[16] + itemcost[17]; 

    int totalPrice = itemcost[18]; 

    lblTotal.Text = Convert.ToString(totalPrice); 
} 

这条线在dbPrices()吐出“输入字符串的不一正确的格式”的错误:

while (reader.Read()) 
{ 
    pr[i] = reader.ToString(); 
    prods[i] = int.Parse(pr[i]); 
} 

我也曾尝试:

while (reader.Read()) 
{ 
    prods[i] = Convert.toInt32(reader.ToString()); 
} 

但也吐出相同的错误。有什么我做错了吗?

+2

为什么不使用'reader.GetInt32(0)'?没有必要先将int转换为字符串。如果'price'是一个'decimal',则使用'reader.GetDecimal'。 –

+0

当你将它转换为int时,你是否已经打开并检查'reader.ToString()'的值是什么?在不知道数据的情况下给出答案是不可能的... –

+0

整数中的价格是“int” –

回答

0

从你的结果的值需要转换成int和你的for循环块可能会导致你在未来的严重问题,您可能想要投影查询,然后分配结果的值。

MySqlCommand cmd = conn.CreateCommand(); 
cmd.CommandText = $"SELECT price FROM products WHERE id BETWEEN 1 AND 18"; //use projection. if you have a dynamic product id set, you can use IN in query. 
MySqlDataReader reader = cmd.ExecuteReader(); 
var counter = 0; //counter 
while (reader.Read()) 
{ 
    prods[counter] = Convert.ToInt32(reader["price"]); //convert the result first then assign it to the item. 
    counter++; 
} 
1

试试这个。我发现,当使用'reader'时,即使你的查询只抓取一个值,你仍然需要指定你要查找的值。

prods[i] = int.Parse(reader["price"]); 

,如果价格是可空的数据库中使用三元运算符

prods[i] = reader["price"] == DBNull.Value ? 0 : int.parse(reader["price"]);