Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 输出参数没有值_C#_Sql Server - Fatal编程技术网

C# 输出参数没有值

C# 输出参数没有值,c#,sql-server,C#,Sql Server,我有一个简单的SQL insert into命令,它在使用ExecuteOnQuery时不起作用。这是我的命令 INSERT INTO [dbo].[et_personhasdevice] ([id_naturalperson], [id_device], [pd_macaddress], [pd_recordate], [pd_status],

我有一个简单的SQL insert into命令,它在使用ExecuteOnQuery时不起作用。这是我的命令

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

}

执行不会引发任何异常,但也不会将记录插入数据库,而且我已经检查了命令,并且在management studio中运行良好

我相信
ExecuteReader()
在枚举其结果之前不会“执行”其命令。相反,我会尝试:

command.ExecuteNonQuery();

我相信
ExecuteReader()
在枚举其结果之前不会“执行”其命令。相反,我会尝试:

command.ExecuteNonQuery();

您根本不需要输出参数。 使用
ExecuteScalar
,它将返回上一条语句SELECT SCOPE\u 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并接收最后执行的一条语句的值,只需将这两条命令用分号分开即可,您根本不需要输出参数。 使用
ExecuteScalar
,它将返回上一条语句SELECT SCOPE\u 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并接收最后执行的一条语句的值,只需将这两条命令用分号分开即可

 command.Parameters["@ID_PERSONHASDEVICE"].Value=...
我在
ID\u PERSONHASDEVICE
之前添加了
@
,我认为它丢失了。

试试看

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

我在
ID\u PERSONHASDEVICE
之前添加了
@
,我认为这是缺少的。

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

首先转到SSMS(或任何用于直接查询数据库以查找不使用SQL Server的用户的界面),并使用适当的变量值运行select语句。如果它没有返回任何记录,那么您就知道插入不起作用的原因

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

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


如果您没有从分析器中获得SQL,那么请查看C#或任何您正在编写的语言中的代码。至少现在你知道问题出在哪里了

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

首先转到SSMS(或任何用于直接查询数据库以查找不使用SQL Server的用户的界面),并使用适当的变量值运行select语句。如果它没有返回任何记录,那么您就知道插入不起作用的原因

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

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



如果您没有从分析器中获得SQL,那么请查看C#或任何您正在编写的语言中的代码。至少现在你知道问题出在哪里了

并且
ID\u PERSONHASDEVICE
是否在
outParameters
中?为什么在不编写查询时调用
ExecuteReader()
?(试试
ExecuteNonQuery
)是的,我在一个块中添加了一个代码,因为execute标量不起作用。问这个问题时,我已经修改了这个问题,试着通过
Profiler
查看正在执行的查询,可能是由于您的
Where
子句,没有线路输出,
ID\u PERSONHASDEVICE
输出参数中吗?为什么在不编写查询时调用
ExecuteReader()
?(试试
ExecuteNonQuery
)是的,我在一个块中添加了一个代码,因为execute标量不起作用。问这个问题时,我已经修改了这个问题,试着通过
Profiler
查看正在执行的查询,可能是由于您的
Where
子句,没有行已经尝试过我在问题中输入的代码中发生的事情是teesting我忘记了更改italready尝试过我在问题中输入的代码中发生的事情是teesting我忘记了更改它不适用于GetScalar,我已经尝试过该函数,它如何不适用于我,我改变了ExecuteOnQueryPerhaps的执行方式,这与如何构建命令和参数值有关。顺便说一句,如果不插入任何记录,那么就没有要返回的标识。这很有意义,因为它不会在数据库中持久存在,但问题在于插入,因为我有一些查询返回标量,并且运行良好,您知道连接有什么问题吗您上面的代码似乎完全正确。当然@PersonalAddress参数与源表中的一条或多条记录匹配,对吗?可能构建两个参数字典的代码和GetSqlQueryCommand的代码有助于理解发生了什么事情GetScalar不起作用,我已经尝试过该函数,但它如何不起作用,我更改了执行