SQLConnection字符串报错:Keyword not supported,求排查代码问题
排查「Keyword not supported on sqlconnection string query」错误
首先直接点明核心问题:你在CanNavigate方法里把连接字符串和SQL查询语句搞混了,这就是触发报错的根本原因!
错误原因拆解
看这段出问题的代码:
using (var con = new SqlConnection(query.ToString())) { using (var cmd = new SqlCommand(str, con)) {
SqlConnection的构造函数需要传入数据库连接字符串,但你错误地传入了SQL查询语句querySqlCommand的构造函数第一个参数应该是SQL查询语句,但你却传了连接字符串str
系统把查询语句当成连接字符串去解析,自然会报错“不支持的关键字”——毕竟SELECT、FROM这类SQL关键字完全不是连接字符串的合法配置项。
修正后的CanNavigate方法
public static bool CanNavigate(string user) { bool result = false; string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; string query = "SELECT tblRole.Navigate FROM tblRole INNER JOIN tblUser ON tblRole.RoleID = tblUser.RoleID WHERE tblUser.Username = @Username"; using (var con = new SqlConnection(connectionString)) { using (var cmd = new SqlCommand(query, con)) { cmd.Parameters.AddWithValue("@Username", user); con.Open(); // 处理查询无结果的情况,避免强制转换抛出异常 var scalarResult = cmd.ExecuteScalar(); result = scalarResult != DBNull.Value ? (bool)scalarResult : false; } } return result; }
额外的潜在问题提醒
ActiveButtons方法的参数冗余:你定义了string user参数,但方法内部直接调用Extensions.UserInfo.CurrentLoggedUser,参数完全没用到。如果CurrentLoggedUser是全局可用的,建议删除这个冗余参数;如果需要支持传入特定用户,就把方法里的CurrentLoggedUser替换成参数user。- 按钮逻辑简化:原代码遍历所有按钮设置可见性,其实可以只定位到目标按钮处理:
var novoBtn = Buttons.FirstOrDefault(b => b.Name == "novoToolStripMenuItem"); if(novoBtn != null) novoBtn.Visible = false; // 其他按钮默认显示的话,无需逐个设置
内容的提问来源于stack exchange,提问作者Carlos Ferreira
相关产品推荐
相关产品推荐

