Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
C# 插入和更新时的执行状态-MS SQL Server_C#_Sql Server_Entity Framework - Fatal编程技术网

C# 插入和更新时的执行状态-MS SQL Server

C# 插入和更新时的执行状态-MS SQL Server,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我有一个令人沮丧的问题 在较低的级别上:我希望能够知道进程中的插入或更新查询是否成功。我不能100%确定所有查询(除了SELECT)是否都返回了状态。我知道SQL Server为所有存储的进程提供了一个返回类型,而目前我所有的进程都有一个整数返回类型 在中间层:在我的存储库中,我想使用Entity Framework调用我存储的进程,并将状态作为转换(从int)布尔值从进程执行返回到我的服务 在更高的级别上:我希望能够使用服务返回的布尔值向MVC控制器报告正在执行的任务 在本期最重要的一层,我有

我有一个令人沮丧的问题

在较低的级别上:我希望能够知道进程中的插入或更新查询是否成功。我不能100%确定所有查询(除了SELECT)是否都返回了状态。我知道SQL Server为所有存储的进程提供了一个返回类型,而目前我所有的进程都有一个整数返回类型

在中间层:在我的存储库中,我想使用Entity Framework调用我存储的进程,并将状态作为转换(从int)布尔值从进程执行返回到我的服务

在更高的级别上:我希望能够使用服务返回的布尔值向MVC控制器报告正在执行的任务

在本期最重要的一层,我有以下代码:

public virtual ObjectResult<int> Proc_AddApprovalProcessor(string userId, string approverId, int approvalOrder)
{
     return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<int>(
        "EXECUTE [dbo].[Proc_AddApprovalProcessor] @userId, @approverId, @approvalOrder",
            new SqlParameter { ParameterName = "userId", Value = userId },
            new SqlParameter { ParameterName = "approverId", Value = approverId },
            new SqlParameter { ParameterName = "approvalOrder", Value = approvalOrder }).FirstOrDefault();
}
public virtual ObjectResult Proc_AddApprovalProcessor(字符串userId、字符串approverId、int approvalOrder)
{
返回((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery(
“执行[dbo].[Proc_AddApprovalProcessor]@userId、@approverId、@approvalOrder”,
新的SqlParameter{ParameterName=“userId”,Value=userId},
新的SqlParameter{ParameterName=“approverId”,Value=approverId},
新的SqlParameter{ParameterName=“approvalOrder”,Value=approvalOrder});
}

确保插入/更新存储过程以以下行结束:

SELECT @@ROWCOUNT

然后检查返回代码并检查它是否为1(或您希望插入/更新的行数)。

确保插入/更新存储过程以以下行结束:

SELECT @@ROWCOUNT

然后检查返回代码并检查它是否为1(或您希望插入/更新的行数)。

您可以在插入/更新查询后立即使用
@@ROWCOUNT
服务器变量,通过使用插入/更新操作检查受影响行数

   declare @fName varchar(50) = 'my name',
            @lName varchar(50) = 'your name'
    INSERT INTO myTable(fName,lName) values(@fName,@lName)

    SELECT @@ROWCOUNT --> 0 - means no rows affected/nothing inserted or updated 
                     --> 1 - means row has been inserted or updated successfully 

您可以在insert/update查询之后立即使用
@@ROWCOUNT
服务器变量,通过insert/update操作检查受影响行的数量

   declare @fName varchar(50) = 'my name',
            @lName varchar(50) = 'your name'
    INSERT INTO myTable(fName,lName) values(@fName,@lName)

    SELECT @@ROWCOUNT --> 0 - means no rows affected/nothing inserted or updated 
                     --> 1 - means row has been inserted or updated successfully 

如果您使用的是事务,则必须使用以下代码返回事务计数


返回@@tracount

如果使用事务,则必须使用以下代码返回事务计数


返回@@tracount

也许值得一提的是,如果表上有触发器,这可能会产生误导。@Evaldas Buinauskas你确定吗?我的大多数update/insert/delete语句都会触发存档表中的条目,而且我对@rowcount从未遇到过问题。也许它适用于更复杂的触发器,但也许你是对的。这个问题似乎回答了混淆:“我认为这是正确的答案,因为如果更新或插入没有成功,触发器通常不会被触发。我可能错了,请不要引用我的话。无论如何,在C#端,任何不是0的数字都会转换为真,这就是我需要的。因此,即使@ROWCOUNT受到触发器的影响,它也只会增加到一个不相关的数字。我只需要0或非零数字就可以满足存储库/服务/控制器层上的逻辑。谢谢你的评论guys@codeshinobi. 非常感谢。同时,我已经检查并可以确认由于触发器触发而插入或更新的其他行不会影响@ROWCOUNT。如果不是这样的话,我的大多数生产代码将无法正常工作。其中一件事你研究过一次就忘了。只有当有人质疑时,你才会突然感到恐慌:-)。很高兴能提供帮助并度过愉快的一天。也许值得一提的是,如果桌子上有触发器,这可能会产生误导。@Evaldas Buinauskas你确定吗?我的大多数update/insert/delete语句都会触发存档表中的条目,而且我对@rowcount从未遇到过问题。也许它适用于更复杂的触发器,但也许你是对的。这个问题似乎回答了混淆:“我认为这是正确的答案,因为如果更新或插入没有成功,触发器通常不会被触发。我可能错了,请不要引用我的话。无论如何,在C#端,任何不是0的数字都会转换为真,这就是我需要的。因此,即使@ROWCOUNT受到触发器的影响,它也只会增加到一个不相关的数字。我只需要0或非零数字就可以满足存储库/服务/控制器层上的逻辑。谢谢你的评论guys@codeshinobi. 非常感谢。同时,我已经检查并可以确认由于触发器触发而插入或更新的其他行不会影响@ROWCOUNT。如果不是这样的话,我的大多数生产代码将无法正常工作。其中一件事你研究过一次就忘了。只有当有人质疑时,你才会突然感到恐慌:-)。很高兴能提供帮助并度过愉快的一天。我不使用交易,但感谢您的评论。我不会使用事务,但谢谢你的评论。我将为以后的参考做书签谢谢你的时间和路径。唯一的问题是print不会将任何内容返回到正在执行的proc,因此仍然会产生与不将其放在那里相同的结果。我会投票给@ROWCOUNT@codeshinobi当然,没问题,谢谢你纠正了我的错误:)谢谢你的时间。唯一的问题是print不会将任何内容返回到正在执行的proc,因此仍然会产生与不将其放在那里相同的结果。我将投票支持@ROWCOUNT@codeshinobi当然,没问题,谢谢你纠正了我的错误:)