输出参数没有值

时间:2014-05-13 17:25:48

标签: c# sql-server

我有简单的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

}

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

4 个答案:

答案 0 :(得分:2)

我将谈谈如何解决这样的问题。

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

如果它返回记录,则运行完整插入。您可能会收到一条错误消息,告知您缺少必填字段的值或其他错误。如果没有错误,请检查表以查看是否插入了数据。如果不是,请检查表格上可能回滚插入的触发器。

一旦您知道该语句有效,然后打开探查器并尝试使用应用程序代码从应用程序运行。 Profiler会告诉你发送了什么,检查它有效的SQL和发送的内容之间的差异。通常变量不会被初始化,这就是没有插入的原因。

如果您没有从Profiler中获取SQL,那么请查看C#中的代码或您正在编写的任何语言。至少现在您确切地知道问题所在。

答案 1 :(得分:1)

我相信ExecuteReader()没有"执行"它的命令直到其结果被枚举。相反,我会尝试:

command.ExecuteNonQuery();

答案 2 :(得分:1)

根本不需要输出参数。 使用ExecuteScalar并返回上一个语句的值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并接收最后一个执行的值,你只需要用分号划分这两个命令

答案 3 :(得分:0)

尝试

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

我在@之前添加了ID_PERSONHASDEVICE,我认为这是{{1}}。