使用MySql.Data设置conn_attrs(program_name)报错,求解决方案
MySQL连接字符串设置程序名称的解决方案
问题说明
想要在MySQL连接中设置程序名称,尝试通过拼接conn_attrs=program_name:alireza到连接字符串的方式实现,代码如下:
var builder = new MySqlConnectionStringBuilder() { Server = "myip", UserID = "myuser", Password = "mypass", Database = "mydb", SslMode = MySqlSslMode.Required, ConnectionTimeout = 30, CharacterSet = "utf8mb4", }; var cs = $"{builder.ConnectionString};conn_attrs=program_name:alireza"; using var conn = new MySqlConnection(cs); using var cmd = new MySqlCommand("Select BookId From Books", conn); conn.Open(); using var reader = await cmd.ExecuteReaderAsync(); while(await reader.ReadAsync()) { int id = reader.GetInt32(0); }
运行时触发错误:
Option not supported. Parameter name: conn_attrs
使用的NuGet包版本:
- MySql.Data Version=8.0.32
- MySql.Data.EntityFramework Version=8.0.32
解决方案
方法一:使用官方支持的ApplicationName属性
MySql.Data驱动原生支持通过ApplicationName连接字符串参数设置程序名称,该参数会自动映射到MySQL的program_name连接属性。直接在MySqlConnectionStringBuilder中设置即可:
var builder = new MySqlConnectionStringBuilder() { Server = "myip", UserID = "myuser", Password = "mypass", Database = "mydb", SslMode = MySqlSslMode.Required, ConnectionTimeout = 30, CharacterSet = "utf8mb4", ApplicationName = "alireza" // 设置程序名称 }; using var conn = new MySqlConnection(builder.ConnectionString); using var cmd = new MySqlCommand("Select BookId From Books", conn); conn.Open(); using var reader = await cmd.ExecuteReaderAsync(); while(await reader.ReadAsync()) { int id = reader.GetInt32(0); }
方法二:连接后设置会话变量
如果需要更灵活的设置,可以在连接打开后执行SQL语句设置program_name会话变量:
var builder = new MySqlConnectionStringBuilder() { Server = "myip", UserID = "myuser", Password = "mypass", Database = "mydb", SslMode = MySqlSslMode.Required, ConnectionTimeout = 30, CharacterSet = "utf8mb4", }; using var conn = new MySqlConnection(builder.ConnectionString); conn.Open(); // 设置程序名称会话变量 using var setProgramCmd = new MySqlCommand("SET SESSION program_name = 'alireza';", conn); await setProgramCmd.ExecuteNonQueryAsync(); // 执行业务查询 using var cmd = new MySqlCommand("Select BookId From Books", conn); using var reader = await cmd.ExecuteReaderAsync(); while(await reader.ReadAsync()) { int id = reader.GetInt32(0); }
说明
MySql.Data 8.0.32版本的连接字符串不支持conn_attrs参数,该参数属于MySQL原生协议字段,但驱动并未将其暴露为连接字符串选项,而是通过ApplicationName属性提供了等价的功能。
内容的提问来源于stack exchange,提问作者Alireza Noori
相关产品推荐
相关产品推荐

