C#SQL存储过程是不是犯(c# sql stored procedure isn't co

2019-10-19 05:18发布

每当我运行下面的代码我得到的预期输出

private int NewBorrower(string givenName, string surname)
{
    int returnValue = 0;
    using (conn)
    {
        conn.Open();
        string sql = "AddBorrower";

        cmd = new SqlCommand(sql, conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@givenName", SqlDbType.NVarChar).Value = givenName;
        cmd.Parameters.Add("@surname", SqlDbType.NVarChar).Value = surname;
        SqlParameter id = cmd.Parameters.Add("@id", SqlDbType.Int);
        id.Direction = ParameterDirection.ReturnValue;

        try
        {
            cmd.ExecuteNonQuery();
            returnValue = (int)cmd.Parameters["@id"].Value;
        }
        catch (Exception e)
        {
            Console.WriteLine("Commit Exception Type: {0}", e.GetType());
            Console.WriteLine("  Message: {0}", e.Message);
        }
    }

    return returnValue;
}

当从前端来看,我得到了我想要的结果,但是当我检查数据库时未在表中显示出来。

良好的措施这也被用于存储过程

CREATE PROCEDURE [dbo].[AddBorrower]
    @givenName nvarchar(50),
    @surname nvarchar(50),
    @id int = NULL OUTPUT
AS
    INSERT INTO llBorrowers (givenName, surname)
    VALUES (@givenName, @surname);
    SET @id = SCOPE_IDENTITY();
RETURN @id

我一直在使用双方的C#和SQL双方交易尝试,并没有在所有的工作。 我还要提到的是它是一个本地数据库,但我不知道应该影响它。

Answer 1:

当你在一个WinForms应用程序中使用DataDirectory目录替换字符串,这取决于你调试它的实际价值变动或释放结构。

在调试DataDirectory目录指向PROJECTFOLDER \ BIN \ DEBUG(或x86变化,如果是这种情况)。
因此,它是非常容易得到这个愚弄。 创建服务器资源管理器的连接,但这种连接是通过你的代码在不同的数据库上工作的忽视。

您可以创建在服务器资源管理器的另一个连接,并将其命名DebugConnection,仍然保持原有的一个架构更改,而你使用DebugConnection来检查你的代码按预期执行

作为一个侧面说明,请特别注意属性Copy To the Output Directory如果该项目的项目之间的上市地产上的MDF文件。 如果你将它设置为Copy Always每次启动调试会话你的数据库的新副本会从项目目录到输出目录有效地破坏你的代码执行的更新被复制。 我建议将其设置为Copy Never和手动处理数据库架构更改

参考: 如果是DataDirectory目录



Answer 2:

您可以尝试建立在C#部分的SqlTransaction

此外,尝试改变像你的代码 -

//Just create a SQL connection - cmd = new SqlCommand(conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "AddBorrower";


文章来源: c# sql stored procedure isn't committing