我有这种格式的存储过程
CREATE PROCEDURE SP_MYTESTpROC @VAR1 VARCHAR(10), @VAR2 VARCHAR(20), @BASEID INT , @NEWID INT OUTPUT As Begin INSERT INTO TABLE_NAME(username, firstname) select @VAR1, @VAR2 WHERE ID = @BASEID SET @NEWID = SCOPE_IDENTITY() AS INT END
我正在使用dapper从C#代码调用此存储过程。我的问题是:在使用dapper时,如何将输出参数传递给存储过程?
只是搜索Test.cs文件,您可以找到此示例
public void TestProcSupport() { var p = new DynamicParameters(); p.Add("a", 11); p.Add("b", dbType: DbType.Int32, direction: ParameterDirection.Output); p.Add("c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); connection.Execute(@"create proc #TestProc @a int, @b int output as begin set @b = 999 select 1111 return @a end"); connection.Query<int>("#TestProc", p, commandType: CommandType.StoredProcedure).First().IsEqualTo(1111); p.Get<int>("c").IsEqualTo(11); p.Get<int>("b").IsEqualTo(999); }
因此,我想您的C#代码可以写成
public void InsertData() { var p = new DynamicParameters(); p.Add("VAR1", "John"); p.Add("VAR2", "McEnroe"); p.Add("BASEID", 1); p.Add("NEWID", dbType: DbType.Int32, direction: ParameterDirection.Output); connection.Query<int>("SP_MYTESTpROC", p, commandType: CommandType.StoredProcedure); int newID = p.Get<int>("NEWID"); }
附带说明,请勿将SP用作存储过程的前缀。它是为系统定义的过程保留的,如果Microsoft决定使用相同的名称,则可能会遇到麻烦。尽管不太可能,但这是一种不良做法,为什么要冒险?