【问题标题】:Datatable C# Input string was not in a correct formatDatatable C# 输入字符串的格式不正确
【发布时间】:2016-11-27 08:06:08
【问题描述】:

我的代码:

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 id=@id";
    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;
}

当我运行代码时,我收到一个错误。请帮我解决它。

【问题讨论】:

  • 您想将 String 放入 Int32 变量中。然后先使用 Int32.Parse 进行转换。
  • 如果您查看错误消息,您会注意到 ExecuteScalar 的返回值不能分配给整数类型的列。所以这里真的有些东西坏了。或者您从数据表中选择了无效列(索引 1 处的列),或者您应该从查询中获得不同的值,或者您试图将查询的返回值分配到错误的列(仍然是索引 1 处的列) )
  • 不要忘记 usingcmd
  • 这不应该是一个单独的查询。这就是 JOIN 的用途。

标签: c# mysql visual-studio datatable format


【解决方案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 */
}

【讨论】:

  • 尝试解析比解析更安全
【解决方案2】:

将字符串解析为整数

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 id=@id";
            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 id=@id";
            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;
        }

【讨论】:

  • 但是“gtennha”的值是“VIOFFICE 124”。
  • @ngocuong 总是以 VIOFFICE 开头?
  • 段的格式。 INT32 转字符串 :)
  • 此转换String dn = dt.Rows[i][1].ToString() 不需要,但需要String gtennha = cmd.ExecuteScalar().ToString();,因为它包含带数字的字符串
【解决方案3】:

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

因此,您需要确定要分配 ExecuteScalar 的返回值的列是什么,并在处理 WHERE 子句不匹配时可能为 NULL 的返回值时格外小心

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 id=@id";
    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;
}

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多