输出参数没有值

本文关键字:参数 输出 | 更新日期: 2023-09-27 18:03:04

我有简单的SQL插入命令不使用ExecuteNonQuery工作。这是我的命令

INSERT INTO [dbo].[et_personhasdevice] 
            ([id_naturalperson], 
             [id_device], 
             [pd_macaddress], 
             [pd_recordate], 
             [pd_status], 
             [created_at], 
             [created_by]) 
SELECT id_person, 
       1, 
       @macAddress, 
       CURRENT_TIMESTAMP, 
       'A', 
       CURRENT_TIMESTAMP, 
       'ETC' 
FROM   [dbo].et_person 
WHERE  pe_address = @personAddress
SET @ID_PERSONHASDEVICE = Scope_identity() 

这是我的代码块

using (SqlCommand command = helper.GetSqlQueryCommand(query))
{
    //In parameters
    foreach (string key in parameters.Keys)
        command.Parameters.AddWithValue(key, parameters[key]);
    //out parameters
    foreach(string key in outParameters.Keys)
    {
        SqlParameter parameter = new SqlParameter();
        parameter.ParameterName = key;
        parameter.Direction = ParameterDirection.Output;         
        parameter.SqlDbType = SqlDbType.Int;
        command.Parameters.Add(parameter);
    }
    command.ExecuteNonQuery();
    command.Parameters["ID_PERSONHASDEVICE"].Value //it does not have a value
}

执行不抛出任何异常,但也不插入记录在数据库中,我也已经检查命令,并在管理工作室工作良好

输出参数没有值

我要谈一谈如何解决这类问题。

首先转到SSMS(或任何你用来直接查询数据库的接口,不使用SQL Server),并运行select语句与适当的变量值。如果它没有返回任何记录,那么你就知道为什么插入不工作了。

如果返回记录,则运行完整插入。您可能会得到一个错误,告诉您缺少必需字段的值或其他一些错误。如果没有错误,则检查表以查看是否插入了数据。如果不是,检查表上是否有可能回滚插入的触发器。

一旦您知道语句有效,那么打开分析器并尝试使用应用程序代码从应用程序运行。分析器将告诉您发送了什么,检查您拥有的有效SQL与发送的SQL之间的差异。通常一个变量不会被初始化,这就是为什么没有插入。

如果你没有从Profiler中得到SQL,那么看看c#或任何你正在编写的语言的代码。至少现在你知道问题出在哪里了。

根本不需要输出参数。SELECT SCOPE_IDENTITY()

当然命令文本应该这样修改

string query   = @"INSERT INTO [dbo].[ET_PERSONHASDEVICE] (
                  [ID_NATURALPERSON],[ID_DEVICE],[PD_MACADDRESS],
                  [PD_RECORDATE],[PD_STATUS],[CREATED_AT],[CREATED_BY])
                  SELECT ID_PERSON,1,@macAddress,CURRENT_TIMESTAMP,'A',
                         CURRENT_TIMESTAMP,'ETC'
                  FROM [dbo].ET_PERSON WHERE PE_ADDRESS = @personAddress;
                  SELECT SCOPE_IDENTITY()";

您可以将两个语句传递给单个SqlCommand并接收最后一个执行的值,您只需要用分号

分隔两个命令。

我相信ExecuteReader()在其结果被枚举之前不会"执行"它的命令。相反,我会尝试使用:

command.ExecuteNonQuery();

Try

 command.Parameters["@ID_PERSONHASDEVICE"].Value=...

我在ID_PERSONHASDEVICE之前添加了@,我认为CC_4缺失了