2016-07-23 100 views
0

我的代码:的DataTable C#输入字符串的不正确的格式

DataTable dt = new DataTable(); 
mySqlDataAdapter.Fill(dt); 
int socot = dt.Rows.Count; 
for (int i = 0; i < socot; i++) 
{ 
    String dn = dt.Rows[i][1].ToString(); 
    String gduan = "SELECT tennha FROM duannha WHERE [email protected]"; 
    MySqlCommand cmd = new MySqlCommand(); 
    cmd.Connection = conn; 
    cmd.CommandText = gduan; 
    cmd.Parameters.AddWithValue("@id", dn); 
    String gtennha = cmd.ExecuteScalar().ToString(); 
    dt.Rows[i][1] = gtennha; 
} 

当我运行代码,我收到一个错误。请帮我修复它。

error

+0

你想把String放入Int32变量中。然后使用Int32.Parse先转换它。 – 2016-07-23 14:56:01

+0

如果查看错误消息,您会注意到ExecuteScalar的返回值不是可以分配给integer类型列的东西。所以有些东西在这里被打破了。或者您从数据表中选择了一个无效列(索引为1的列),或者应该从查询中获得不同的值,或者您试图在错误的列上指定查询的返回值(仍然是索引为1的列) – Steve

+0

不要忘记'cmd'的'使用'块 – Drew

回答

1

预期的类型作为的Int32

如果gtennha包含一个数字,您可以将其解析到一个int。随着越来越多的保障:

var gtennha = cmd.ExecuteScalar(); 
try 
{ 
    if(gtennha != null) 
     dt.Rows[i][1] = int.Parse(gtennha.ToString()); 
    else 
     Console.WriteLine("Error: Query didn't return a result."); 
} 
catch(FormatException ex) 
{ 
    Console.WriteLine("Error: Couldn't parse 'gtennha' to a number."); 
    /* more error handling */ 
} 
+1

尝试解析比解析更安全 – Mostafiz

1

解析字符串为int

DataTable dt = new DataTable(); 
     mySqlDataAdapter.Fill(dt); 
     int socot = dt.Rows.Count; 
     for (int i = 0; i < socot; i++) 
     { 
      String dn = dt.Rows[i][1].ToString(); 
      String gduan = "SELECT tennha FROM duannha WHERE [email protected]"; 
      MySqlCommand cmd = new MySqlCommand(); 
      cmd.Connection = conn; 
      cmd.CommandText = gduan; 
      cmd.Parameters.AddWithValue("@id", dn); 
      String gtennha = cmd.ExecuteScalar().ToString(); 
      int a; 
      int.TryParse(gtennha, out a); 
      dt.Rows[i][1] = a; 
     } 

更新

如果gtennha总是VIOFFICE启动或单词类似的东西,然后用这种方式分割字符串

DataTable dt = new DataTable(); 
     mySqlDataAdapter.Fill(dt); 
     int socot = dt.Rows.Count; 
     for (int i = 0; i < socot; i++) 
     { 
      String dn = dt.Rows[i][1].ToString(); 
      String gduan = "SELECT tennha FROM duannha WHERE [email protected]"; 
      MySqlCommand cmd = new MySqlCommand(); 
      cmd.Connection = conn; 
      cmd.CommandText = gduan; 
      cmd.Parameters.AddWithValue("@id", dn); 
      String gtennha = cmd.ExecuteScalar().ToString(); 
      int a; 
      int.TryParse(gtennha.Split(' ')[1], out a); 
      dt.Rows[i][1] = a; 
     } 
+0

但“gtennha”有价值“VIOFFICE 124”。 –

+0

@ngocuong总是以VIOFFICE开头? – Mostafiz

+0

@ngocuong查看我的更新 – Mostafiz

0

我认为你选择了错误的列来分配ExecuteScalar查询的返回值。从错误信息中可以明显看出,返回值是一个字符串“VI BUILDING 29BD”(或类似的东西),并且您正试图将该值分配给您用作ID参数源的同一列dt.Rows[i][1]。这当然是不正确的。

所以,你需要确定哪些是要分配的ExecuteScalar的返回值,并采取额外的照顾上的处理,可能是NULL是返回值如果在WHERE子句中没有匹配列

DataTable dt = new DataTable(); 
mySqlDataAdapter.Fill(dt); 
int socot = dt.Rows.Count; 
for (int i = 0; i < socot; i++) 
{ 
    String dn = dt.Rows[i][1].ToString(); 
    String gduan = "SELECT tennha FROM duannha WHERE [email protected]"; 
    MySqlCommand cmd = new MySqlCommand(); 
    cmd.Connection = conn; 
    cmd.CommandText = gduan; 
    cmd.Parameters.AddWithValue("@id", dn); 
    object result = cmd.ExecuteScalar(); 

    // SUPPOSE THAT YOU WANT TO ASSIGN AT COLUMN 2 NOT STILL AT COLUMN 1 
    if(result != null) 
     dt.Rows[i][2] = gtennha; 
}