在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
相关产品推荐
相关产品推荐

