输出参数没有值
本文关键字:参数 输出 | 更新日期: 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缺失了