【问题标题】:MySQL System.FormatException: Input string was not in a correct formatMySQL System.FormatException:输入字符串的格式不正确
【发布时间】:2011-05-04 16:56:02
【问题描述】:

目前,我正在使用 ASP.NET MVC3 和 MySQL 创建一个应用程序,当我尝试从数据库中检索用户的名字时,我收到一个 System.FormatException:输入字符串格式不正确。

这是我的代码:

public string GetUserFirstName(UInt64 id)
{
   DBConnections databaseCnnString = new DBConnections();
   string connectionString = "server=123.123.com;user=me;database=db1;port=3306;password=abcdef";
   MySqlConnection cnn = new MySqlConnection(connectionString);

   try
   {
      cnn.Open();
      string sp_GetFName = "SP_GET_FNAME";
      MySqlCommand cmd = new MySqlCommand(sp_GetFName, cnn);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.AddWithValue("id", id);
      cmd.Parameters["id"].Direction = ParameterDirection.Input;
      cmd.Parameters.AddWithValue("first_name", MySqlDbType.VarChar);
      cmd.Parameters["first_name"].Direction = ParameterDirection.Output;

      object result = cmd.ExecuteScalar();
      if (result != null)
      {
         string fname = Convert.ToString(result);
         return fname; 
      }
      else
      {
         string fname = "friend";
         return fname; 
      }

   }
   catch (Exception ex)
   {
      throw (ex);
   }
   finally
   {
      cnn.Close();
      cnn.Dispose();
   }
}

这是 MySQL 存储过程:

CREATE DEFINER=`0001`@`%` PROCEDURE `SP_GET_FNAME`(IN id BIGINT(20), OUT first_name VARCHAR(60))
BEGIN
    DECLARE user_id BIGINT(20) DEFAULT id;
    DECLARE output VARCHAR(60);
    SELECT `FName` FROM `users` WHERE USERID=user_id INTO output;
    SET first_name = output;
END

问题似乎出在执行 cmd.ExecuteScalar() 时。

我的问题是什么?

提前谢谢你!

【问题讨论】:

    标签: mysql asp.net-mvc


    【解决方案1】:

    我的复制和粘贴错误。按预期工作的正确代码是:

    public string GetUserFirstName(UInt64 id)
    {
        DBConnections databaseCnnString = new DBConnections();
        string connectionString = "server=123.123.com;user=me;database=db1;port=3306;password=abcdef";
        MySqlConnection cnn = new MySqlConnection(connectionString);
    
        try
        {
            cnn.Open();
            string sp_GetFName = "SP_GET_FNAME";
            MySqlCommand cmd = new MySqlCommand(sp_GetFName, cnn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("id", id);
            cmd.Parameters["id"].Direction = ParameterDirection.Input;
            cmd.Parameters.Add(new MySqlParameter("first_name", MySqlDbType.VarChar));
            cmd.Parameters["first_name"].Direction = ParameterDirection.Output;
            cmd.ExecuteScalar();
            string fname = Convert.ToString((cmd.Parameters["first_name"].Value));
    
            return fname;
    
         }
         catch (Exception ex)
         {
             throw (ex);
         }
         finally
         {
            cnn.Close();
            cnn.Dispose();
         }
     }
    

    更正:cmd.Parameters.Add(new MySqlParameter("first_name", MySqlDbType.VarChar)); 不是:cmd.Parameters.AddWithValue("first_name", MySqlDbType.VarChar);

    在我的例子中,用户表中的 FNAME 字段不能为 NULL;因此,无需检查代码中返回的 NULL 值。

    【讨论】:

      【解决方案2】:

      我猜是找不到用户或者fname为空。

      我真的希望您不要为每个用户列查询数据库。

      祝你好运。

      【讨论】:

      • 哈哈......不......用户在那里,我没有为每个用户列查询数据库。如果我直接使用 Workbench 执行查询,它会返回一个值,这就是我要查找的值。
      【解决方案3】:

      附加评论。 当尝试返回字符串值时,AddWithValue 似乎正在尝试将输出从字符串转换为数字。这会导致字符串格式异常。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2011-11-23
        • 2022-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多