C# WinForm查询SQL Server始终加密列报@SSN标量变量未声明错误如何解决
错误原因
- 你创建的
@SSN参数没有添加到SqlCommand的Parameters集合中,命令对象无法识别该参数 - 实例化
SqlDataAdapter时没有传入已经配置好的SqlCommand对象,而是传入了原始SQL字符串,数据适配器使用的新命令没有绑定任何参数,因此抛出找不到变量的错误 - 参数
Value赋值时额外添加了单引号,参数化查询会自动处理值的引号包裹,手动添加会导致实际查询值与预期不符
修复代码
private void btnSearch_Click(object sender, EventArgs e) { // 连接对象用using包裹会自动释放资源,无需手动调用Close using (SqlConnection con = new SqlConnection("Data Source = " + IP + "; Initial Catalog = " + db + "; Persist Security Info = False; User ID = " + username + "; Password = " + password + ";Column Encryption Setting = Enabled;")) { con.Open(); using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = @"SELECT * FROM AE WHERE TEST_TYPE = @SSN"; SqlParameter paramSSN = cmd.CreateParameter(); paramSSN.ParameterName = "@SSN"; paramSSN.DbType = DbType.AnsiStringFixedLength; paramSSN.Direction = ParameterDirection.Input; // 去掉手动添加的单引号 paramSSN.Value = "INITIAL_TEST"; paramSSN.Size = 18; // 将参数添加到命令的参数集合中 cmd.Parameters.Add(paramSSN); DataSet data_set = new DataSet(); // 直接传入已配置好参数的SqlCommand对象,不要重复传入SQL和连接 dataAdapter = new SqlDataAdapter(cmd); SqlCommandBuilder commandbuild = new SqlCommandBuilder(dataAdapter); dataAdapter.Fill(data_set); dataGridView1.DataSource = data_set.Tables[0].DefaultView; int rowCount = data_set.Tables[0].Rows.Count; label6.Text = rowCount.ToString();//Total record } } }
始终加密场景额外注意
- 确保客户端设备已导入对应加密列的列加密密钥(CEK)证书,且当前程序运行的Windows账号拥有证书的读取权限
- 不要修改连接字符串中的
Column Encryption Setting = Enabled配置,该配置是客户端加密参数传递的必要项
内容的提问来源于stack exchange,提问作者Rba Egn
相关产品推荐
相关产品推荐

