【问题标题】:Cannot print exception string because Exception.ToString() failed无法打印异常字符串,因为 Exception.ToString() 失败
【发布时间】:2021-12-29 15:00:13
【问题描述】:

我正在尝试连接 MySql 数据库,但是在执行代码时它给了我这个错误:

无法打印异常字符串,因为 Exception.ToString() 失败

using System;

using MySql.Data.MySqlClient;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string connStr = "server=localhost;user=root;database=people;password=slidan4eg";

            MySqlConnection conn = new MySqlConnection(connStr);

            conn.Open();

            string sql = "SELECT name FROM men WHERE id = 2";

            MySqlCommand command = new MySqlCommand(sql, conn);

            string name = command.ExecuteScalar().ToString();

            Console.WriteLine(name);

            conn.Close();

        }
    }
}

UPD:我试图调试这个并且调试器说程序在conn.Open(); 上被破坏了,我认为这可能很重要

【问题讨论】:

  • 旁白:您在连接和命令对象上缺少using,您必须处置它们,否则您将泄漏连接

标签: c# mysql sql


【解决方案1】:

根据您的屏幕截图,您有一个System.IO.FileNotFoundException,而您缺少System.Security.Permissions 程序集。您可以使用 Visual Studio 中的 NuGet-PaketManager 进行安装。

【讨论】:

  • 谢谢,我遇到了一些其他异常,但我以相同的方式解决了它们,现在一切正常)
【解决方案2】:

如果是ExecuteScalar,您将获得:

  1. null 如果光标为空
  2. 如果光标非空,则光标的第一条记录中的第一个字段值。

发生了什么:

问题出在

string name = command.ExecuteScalar().ToString();

线。如果光标为空,command.ExecuteScalar() 将返回 null 并且您在 null.ToString(); 尝试时抛出异常

代码:

在你的情况下,我们可以利用Convert.ToString() 而不是.ToString(),而null 可以处理

static void Main(string[] args) {
  string connStr = "...";

  //DONE: Dispose IDisposable with a help of using
  using (MySqlConnection conn = new MySqlConnection(connStr)) {
    conn.Open();

    //DONE: let sql query be readable
    string sql = 
      @"SELECT name 
          FROM men 
         WHERE id = 2";

    using (MySqlCommand command = new MySqlCommand(sql, conn)) {
      // if cursor is empty we'll get null which we turn into "Not Found"
      string name = Convert.ToString(command.ExecuteScalar()) ?? "Not Found";

      Console.WriteLine(name);
    }
  }
}

另一种可能性是 null 传播 ?. 运算符。而不是

string name = command.ExecuteScalar().ToString();

string name = command.ExecuteScalar()?.ToString() ?? "Not found";

【讨论】:

【解决方案3】:

您需要先将结果集存储到一个变量(sql reader 类型)中,然后您可以从该变量中一个一个地读取值。要选择第一条记录,您可以遵循以下技术:

using System;
using MySql.Data.MySqlClient;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string connStr = "server=localhost;user=root;database=people;password=slidan4eg";
            string name = "";
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();

            string sql = "SELECT name FROM men WHERE id = 2";
            MySqlCommand command = new MySqlCommand(sql, conn);

            var dr = command.ExecuteReader();
            if (dr.HasRows)
            {
                dr.Read(); // Read first record.
                name = dr.GetString(0); // Get value of name
            }
            dr.Close();
            conn.Close();
            Console.WriteLine(name);
        }
    }
}

【讨论】:

  • .Close();不是正确的处理方式,需要using否则有异常会泄露
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多