0

我尝试实现对 Stored proc 的调用,并且 proc 返回稍后将使用的 ID。每次执行时,我都会将输出参数设为 -1。下面是我的示例代码:

        OleDbCommand sqlStrProc = new OleDbCommand();
        sqlStrProc.Connection = dbConn;
        sqlStrProc.CommandText = "dbo.insert_test";
        sqlStrProc.CommandType = CommandType.StoredProcedure;

        sqlStrProc.Parameters.Add("@p_TestID", OleDbType.Integer, 255).Direction = ParameterDirection.Output;

        sqlStrProc.Parameters.Add("@p_TestName", OleDbType.VarChar).Value = "Test";
        sqlStrProc.Parameters.Add("@p_CreatedBy", OleDbType.VarChar).Value = "Test";


        int personID = sqlStrProc.ExecuteNonQuery();
        Row.outPersonID = personID;  

personID 始终为 -1。我在这里做错了什么。请帮忙..!!下面是存储的过程代码

CREATE PROCEDURE [dbo].[INSERT_TEST]
     @p_TestID int OUTPUT,
     @p_TestName varchar (50),
     @p_CreatedBy varchar (100)
AS
SET NOCOUNT ON


INSERT INTO Test(
    TestName,
    CreatedBy)
VALUES
(    @p_TestName,
    @p_CreatedBy)

SELECT @p_TestID = SCOPE_IDENTITY()
4

2 回答 2

0

-1 可能意味着存储过程未能按预期执行并且事务已回滚。您可能需要查找任何截断问题,因为 2 个输入参数的大小不同,但使用相同的输入。另外我假设您有适当的代码来打开和关闭连接等?

于 2014-03-18T17:38:34.177 回答
-1

-1返回值是您的SP执行过程中产生的错误,这是由于以下原因:

  1. SP 结构:每次执行 SP 时,它都会尝试在它已经存在时再次创建它。因此您必须将其设为ALTER PROCEDURE 而不是CREATE PROCEDURE 或执行以下操作:

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[INSERT_TEST]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[INSERT_TEST] GO

    创建过程 [dbo].[INSERT_TEST] @p_TestID int OUTPUT, @p_TestName varchar (50), @p_CreatedBy varchar (100) AS

  2. 数据库连接(表名称和位置):您必须在 OLEDB 中指定将您连接到写入数据库的ConnectionString 。尝试测试完整的表路径;像下面这样;

    插入[DATABASENAME].[SHCEMA].[TABELNAME](名称,CreatedBy)值(@p_TestName,@p_CreatedBy)

  3. 将您的 SP 定义为:

    创建过程 [名称]

    作为 开始结束

认为这不是问题,但这是根据连接事务编写 SP 的正确方法,

让我知道它是否适合你:)

毕业生,S.ANDOURA

于 2014-03-19T09:52:04.037 回答