我有简单的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
}
执行不会抛出任何异常,但也没有在数据库中插入记录,我也已经检查了命令并在管理工作室中运行良好
答案 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}}。