含@符号的MySQL列名在C#动态SQL执行中报错的问题咨询
解决C#执行带@列名的MySQL创建表语句报错问题
我来帮你搞定这个问题!核心原因是MySQL默认不认可双引号作为标识符的包裹符号,而开启ANSI_QUOTES sql模式后,MySQL会遵循标准SQL规则,把双引号当作标识符引号使用——这也是你手动执行SET sql_mode='ANSI_QUOTES';后能成功的原因。下面是两种代码层面的可行方案:
1. 在连接字符串中自动启用ANSI_QUOTES
你可以直接在C#的MySQL连接字符串里添加Sql Mode=ANSI_QUOTES;参数,这样每次建立数据库连接时会自动激活该模式,不需要额外执行SET语句。示例代码如下:
string connectionString = "server=你的服务器地址;user=用户名;password=密码;database=目标库;Sql Mode=ANSI_QUOTES;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); string createTableSql = "CREATE TABLE dump (\"@employee_OID\" VARCHAR(50));"; using (MySqlCommand command = new MySqlCommand(createTableSql, connection)) { command.ExecuteNonQuery(); } }
2. 执行创建表语句前临时设置sql_mode
如果不想修改全局连接的sql模式,你可以在每次执行目标SQL前,先单独执行设置sql_mode的语句,仅在当前连接生效。示例代码:
string connectionString = "server=你的服务器地址;user=用户名;password=密码;database=目标库;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); // 先临时设置sql模式 using (MySqlCommand setModeCommand = new MySqlCommand("SET sql_mode='ANSI_QUOTES';", connection)) { setModeCommand.ExecuteNonQuery(); } // 再执行创建表的语句 string createTableSql = "CREATE TABLE dump (\"@employee_OID\" VARCHAR(50));"; using (MySqlCommand createCommand = new MySqlCommand(createTableSql, connection)) { createCommand.ExecuteNonQuery(); } }
小提醒
开启ANSI_QUOTES模式后,双引号只能用来包裹标识符(比如你的@employee_OID列名),字符串常量必须用单引号表示。如果你的其他SQL语句里有用双引号写字符串的情况,记得改成单引号避免新的报错哦~
内容的提问来源于stack exchange,提问作者oshirwani
相关产品推荐
相关产品推荐

