Sql server 从SQL Server存储过程中获取插入的id和特定错误消息
我正在使用dapper访问SQL Server 2016。我有一个名为Country的表,带有一个自动递增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)
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之间没有区别,因为您只修改了一个表。如果要修改多个表并使用触发器,必须小心。更多信息请点击此处: