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

C#执行SQL时报@qte标量变量未声明:无需存储过程的解决方法

解决SQL标量变量未声明及上下文变量不存在的问题

先帮你拆解下两个错误的原因,再给出具体的解决方案:

第一个错误:The scalar variable "@qte" must be declared

你虽然声明了param(对应@qte)和param1(对应@remise)这两个SqlParameter对象,但根本没把它们添加到SqlCommand的Parameters集合里,SQL Server自然找不到这些参数。另外你代码里也没给@remise传值,同样会触发类似错误。

第二个错误:The name 'DL_Qte' don't exist in the current context

DL_Qte是数据库表F_DOCLIGNE的字段名,不是C#代码里定义的变量,你直接把它传给AddWithValue肯定会报错——C#不知道这个名字指的是什么。你需要先从数据库读取这个字段的值,存储到C#变量里,再把变量传给参数。


无需存储过程的解决方案

核心思路是:先查询数据库获取DL_Qte和DL_Remise01REM_Valeur的当前值,再把这些值作为参数传给更新命令。以下是修正后的完整代码:

Connection newconnection = new Connection();
newconnection.Connection_Today();

// 1. 先从数据库获取需要的@qte和@remise对应的值
int qteValue = 0;
int remiseValue = 0;
string getValuesQuery = "SELECT DL_Qte, DL_Remise01REM_Valeur FROM F_DOCLIGNE WHERE AR_Ref = @code";

// 使用using语句自动释放资源,是C#数据库操作的最佳实践
using (SqlCommand getValuesCmd = new SqlCommand(getValuesQuery, Connection.conn))
{
    getValuesCmd.Parameters.Add("@code", SqlDbType.VarChar).Value = textBox_art.Text;
    
    using (SqlDataReader reader = getValuesCmd.ExecuteReader())
    {
        // 如果查询到对应记录,读取字段值
        if (reader.Read())
        {
            qteValue = reader.GetInt32(reader.GetOrdinal("DL_Qte"));
            remiseValue = reader.GetInt32(reader.GetOrdinal("DL_Remise01REM_Valeur"));
        }
        else
        {
            // 这里可以添加逻辑处理:如果没找到对应AR_Ref的记录,比如抛出提示或返回
            MessageBox.Show("未找到对应编码的记录!");
            return;
        }
    }
}

// 2. 执行更新操作
using (SqlCommand comm = new SqlCommand())
{
    comm.Connection = Connection.conn;
    comm.CommandText = "UPDATE F_DOCLIGNE SET DO_DateLivr = @date, DL_Qte = @qte, DL_Remise01REM_Valeur = @remise, DL_PrixUnitaire = @pu, DL_MontantHT = (@pu - ((@remise * @pu) / 100)) * @qte WHERE AR_Ref = @code";
    
    // 添加所有SQL中用到的参数,确保每个@开头的变量都有对应参数
    comm.Parameters.AddWithValue("@date", textBox_livr.Text);
    // 注意:textBox_prix.Text是字符串,需要转换为int匹配参数类型
    comm.Parameters.Add("@pu", SqlDbType.Int).Value = int.Parse(textBox_prix.Text);
    comm.Parameters.Add("@code", SqlDbType.VarChar).Value = textBox_art.Text;
    comm.Parameters.Add("@qte", SqlDbType.Int).Value = qteValue;
    comm.Parameters.Add("@remise", SqlDbType.Int).Value = remiseValue;
    
    comm.ExecuteNonQuery();
    MessageBox.Show("更新成功!");
}

关键注意事项

  1. 参数完整性:SQL语句中所有带@的变量,必须在SqlCommand.Parameters中添加对应参数,缺一不可。
  2. 类型匹配:确保C#变量的类型和SQL参数类型一致(比如textBox的文本要转成int,因为你定义了SqlDbType.Int),否则会触发类型转换错误。
  3. 空值/无记录处理:如果查询不到对应AR_Ref的记录,要添加逻辑处理,避免用默认值0去更新数据,导致错误。
  4. 资源释放:使用using语句包裹SqlCommand和SqlDataReader,确保数据库连接资源被及时释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者LatoyaM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:28:54