You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中检查MySQL数据库是否存在时遭遇SQL语法错误

解决MySQL数据库存在性检查的SQL语法错误

问题根源

你的SQL语句拼接时出现了空格缺失:原代码中"SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA"和"WHERE SCHEMA_NAME LIKE 'database_name';"直接拼接,会生成SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATAWHERE SCHEMA_NAME LIKE 'database_name';——SCHEMATA和WHERE连在一起,导致MySQL无法识别语法。

另外,ExecuteScalar()的使用逻辑错误:它返回的是查询结果的第一行第一列值(这里是匹配的数据库名),而非匹配的行数,所以Convert.ToInt32(myCommand.ExecuteScalar())会在无匹配时抛出转换异常。

修正后的代码

using MySql.Data.MySqlClient;

using (MySqlConnection connection = new MySqlConnection("Server=localhost;Uid=root;Pwd=password;"))
{
    connection.Open();
    if (CheckDatabaseExistence(connection, "database_name")) 
        Console.WriteLine("Database Exists.");
    else
        Console.WriteLine("Database does not exist.");
}

bool CheckDatabaseExistence(MySqlConnection connection, string dbName)
{
    // 使用COUNT(*)直接统计匹配行数,逻辑更直观
    string sql = @"SELECT COUNT(*) 
                   FROM INFORMATION_SCHEMA.SCHEMATA 
                   WHERE SCHEMA_NAME = @DbName;";

    using (MySqlCommand myCommand = new MySqlCommand(sql, connection))
    {
        // 参数化查询,避免SQL注入,同时处理特殊字符
        myCommand.Parameters.AddWithValue("@DbName", dbName);
        // ExecuteScalar返回匹配的行数,转换为int判断是否大于0
        int count = Convert.ToInt32(myCommand.ExecuteScalar());
        return count > 0;
    }
}

关键修正点

  • 补全SQL空格:在SCHEMATA和WHERE之间添加空格,保证语法正确
  • 改用COUNT(*)查询:直接统计符合条件的数据库数量,避免ExecuteScalar返回null的转换问题
  • 参数化查询:通过@DbName参数传递数据库名,避免SQL注入风险,同时适配包含特殊字符的数据库名
  • 优化返回逻辑:判断统计行数是否大于0,更准确反映数据库是否存在

额外说明

如果需要使用模糊匹配(比如匹配多个相似名称的数据库),可以把=改成LIKE,并在参数中添加通配符,例如:

myCommand.Parameters.AddWithValue("@DbName", "%db_prefix%");

内容的提问来源于stack exchange,提问作者Nobidag297

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:55:09