Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 从SQL Server存储过程中获取插入的id和特定错误消息_Sql Server_Stored Procedures_Error Handling - Fatal编程技术网

Sql server 从SQL Server存储过程中获取插入的id和特定错误消息

Sql server 从SQL Server存储过程中获取插入的id和特定错误消息,sql-server,stored-procedures,error-handling,Sql Server,Stored Procedures,Error Handling,我正在使用dapper访问SQL Server 2016。我有一个名为Country的表,带有一个自动递增id、一个代码和一个标签。要添加新国家/地区,我的数据库中有以下存储过程: CREATE PROCEDURE [dbo].[AddNewCountry] ( @Code varchar (50), @Label varchar (50) ) AS BEGIN INSERT INTO Country VALUES(@Code,@Label)

我正在使用dapper访问SQL Server 2016。我有一个名为Country的表,带有一个自动递增id、一个代码和一个标签。要添加新国家/地区,我的数据库中有以下存储过程:

CREATE PROCEDURE [dbo].[AddNewCountry]  
(  
   @Code varchar (50),  
   @Label varchar (50) 
)  
AS  
BEGIN  
   INSERT INTO Country
   VALUES(@Code,@Label)  
END
我从存储库调用存储过程:

public class EmpRepository      
{      
    public SqlConnection con;

    private void connection()      
    {      
        string constr = ConfigurationManager.ConnectionStrings["SqlConn"].ToString();      
        con = new SqlConnection(constr);      

    }      
    //To Add Employee details      
    public void AddCountry(CountryModel objCountry)
    {     
        try      
        {      
            connection();      
            con.Open();      
            con.Execute("AddNewCountry", objCountry, commandType: CommandType.StoredProcedure);      
            con.Close();      
        }      
        catch (Exception ex)      
        {      

            throw ex;      
        }      

    } 
如果我试图添加代码已经存在的国家,我希望从存储过程中抛出一条特定的错误消息,如“该国家已经存在”

如果添加了国家/地区,我想抛出自动递增的id


因此,如果有人知道如何从存储过程发送一种具有Id和ErrorMessage的对象,请告诉我。

正如Zohar Peled所说,我不会在这里抛出异常。 只需处理过程中的返回消息

下面是一个例子:

CREATE PROCEDURE [dbo].[AddNewCountry] 
(  
   @Code varchar (50),  
   @Label varchar (50),
   @Message VARCHAR OUTPUT,
   @ID INT OUTPUT
)  
AS  
BEGIN 
    IF NOT EXISTS (SELECT 1 FROM Country WHERE Code = @Code)
    BEGIN
        INSERT INTO Country VALUES(@Code,@Label)
        SET @ID = @@IDENTITY
        SET @Message = 'Code inserted'
    END
    ELSE
    BEGIN
        SET @ID = 0
        SET @Message = 'Code already exists'
    END

    SELECT @Message, @ID
END

看看哪个将向客户端抛出应用程序异常。您可以指定要插入到错误字符串中的参数,以便填充该字符串,该字符串将包含自动递增的ID。虽然我无法理解为什么要在异常成功时引发异常,但您应该只返回该值。对于可以轻松签入代码的内容,请不要使用异常。例外情况主要针对您无法控制的事情,如网络错误等。只需测试表中是否已经存在该值。您可以使用输出参数指示存储过程是否失败或成功。我从未说过布尔值。。。可以返回int值和text值。我现在离电脑不远,所以我不能给你看一些密码。谢谢你,这正是我需要的。我可以问你为什么像@John Wu建议的那样使用@IDENTITY而不是SCOPE_IDENTITY()?我不会在这里使用
@@IDENTITY
。最好的选择可能是在insert语句中使用output子句。此外,您还应该阅读Dan Guzman的《只是一种习惯》,在本例中,SCOPE_IDENTITY和@IDENTITY之间没有区别,因为您只修改了一个表。如果要修改多个表并使用触发器,必须小心。更多信息请点击此处: