You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:18:05