Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
如何在SQL Server数据库中插入条目,并使用C#中的一个命令返回包含主键标识的插入列?_C#_Sql Server - Fatal编程技术网

如何在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

我有一个
场合
对象,它包括一个字符串
描述
、一个int
fundId
、一个datetime
date
和int
occasionId
。相同的字段在我的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
返回)。。。。。