C# 输出参数没有值
我有一个简单的SQL insert into命令,它在使用ExecuteOnQuery时不起作用。这是我的命令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],
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不起作用,我已经尝试过该函数,但它如何不起作用,我更改了执行