如何在SQL Server数据库中插入条目,并使用C#中的一个命令返回包含主键标识的插入列?
我有一个如何在SQL Server数据库中插入条目,并使用C#中的一个命令返回包含主键标识的插入列?,c#,sql-server,C#,Sql Server,我有一个场合对象,它包括一个字符串描述、一个intfundId、一个datetimedate和intoccasionId。相同的字段在我的SQL Server数据库中,OccasionId是主键(自动递增) 我正在尝试插入一个新条目并将所有字段返回到对象中。以下是我当前的代码,它不起作用: public Occasion InsertNewOccasion(string description, DateTime date, int fundId) { Occasion occasion
场合
对象,它包括一个字符串描述
、一个intfundId
、一个datetimedate
和intoccasionId
。相同的字段在我的SQL Server数据库中,OccasionId
是主键(自动递增)
我正在尝试插入一个新条目并将所有字段返回到对象中。以下是我当前的代码,它不起作用:
public Occasion InsertNewOccasion(string description, DateTime date, int fundId)
{
Occasion occasion = new Occasion();
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand("INSERT into Occasions OUTPUT INSERTED.Description, INSERTED.Date values(@description, @date, @fundId); SELECT @@identity AS OccasionId", connection);
command.Parameters.AddWithValue("@description", description);
command.Parameters.AddWithValue("@date", date);
command.Parameters.AddWithValue("@fundId", fundId);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
occasion.Description = (string) reader["Description"];
occasion.Date = (DateTime) reader["Date"];
occasion.OccasionId = (int) reader["OccasionId"];
}
}
return occasion;
}
将sql命令行更改为以下内容:
SqlCommand command = new SqlCommand("INSERT into Occasions (Description, Date, FundID) SELECT @description, @date, @fundId; SELECT Description, Date, OccasionId FROM Occasions WHERE OccasionId = SCOPE_IDENTITY()", connection);
INSERT into Occasions (Description, Date, fundId)
output inserted.Description, inserted.Date, inserted,OccasionId
values (@description, @date, @fundId)
此外,根据@JamesZ的说法,这是假设OccasionId是,并且标识字段使SQL过于复杂。使用以下命令:
INSERT into Occasions ([description], [date], [fundId]) OUTPUT INSERTED.OccasionId, INSERTED.Description, INSERTED.Date values (@description, @date, @fundId);
记住,INSERTED
psuedo表与触发器中可用的表相同。因此,它可以访问表中的所有列,甚至是自动递增的列
但是,我还建议只使用当前变量来设置时机.Description
和时机.Date
,因为您已经在传递这些变量了。这样,你就不必浪费精力把它们拿回来,然后在它们已经以正确的类型出现时铸造它们
1) 将SQL更改为:
INSERT INTO Occasions ([description], [date], [fundId]) OUTPUT INSERTED.OccasionId VALUES (@description, @date, @fundId);
2) 将C#更改为:
{替换以下内容}
SqlDataReader=command.ExecuteReader();
while(reader.Read())
{
Description=(字符串)读取器[“Description”];
日期=(日期时间)读取器[“日期”];
OccasionId=(int)读卡器[“OccasionId”];
}
{与下面的}
sition.OccasionId=(int)(command.ExecuteScalar());
场合。描述=描述;
日期=日期;
您可能看起来像这样:
SqlCommand command = new SqlCommand("INSERT into Occasions (Description, Date, FundID) SELECT @description, @date, @fundId; SELECT Description, Date, OccasionId FROM Occasions WHERE OccasionId = SCOPE_IDENTITY()", connection);
INSERT into Occasions (Description, Date, fundId)
output inserted.Description, inserted.Date, inserted,OccasionId
values (@description, @date, @fundId)
假设表中的OccasionID列为identity。这既容易出错,又不必要。由于使用了@@IDENTITY
而不是SCOPE\u IDENTITY()
,因此容易出错。由于通过O.P.已经使用的OUTPUT
子句已经提供了值,因此需要额外查找。谢谢。并澄清为什么SCOPE\u IDENTITY()
:它不容易通过该表上的触发器将另一个表的标识插入到该表中,而@@IDENTITY
是。因此,“容易出错”。@MirrorEyes请参阅我关于如何简化C代码的附加说明。您当前所做的工作超出了必要的范围。@MirrorEyes同样,如果这确实有效,请不要忘记标记为“已接受”(此答案旁边的复选标记)。谢谢。或者只使用实体框架,它支持这种开箱即用的功能。。。。。(存储实体,并免费获取自动递增的ID
返回)。。。。。