c#sql存储过程没有提交

时间:2014-01-12 13:05:14

标签: c# sql sql-server stored-procedures commit

每当我运行以下代码时,我都会得到预期的输出

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端使用事务,但这根本不起作用。 我还应该提一下,它是一个本地数据库,但我不确定是否应该影响它。

2 个答案:

答案 0 :(得分:2)

在WinForms应用程序中使用DataDirectory替换字符串时,其实际值会根据您的调试或发布配置而更改。

在DEBUG中,您的DataDirectory指向PROJECTFOLDER \ BIN \ DEBUG(如果是这种情况,则指向x86变体)。
所以很容易被这个愚弄。您可以在服务器资源管理器中创建连接,但在不同数据库上运行的代码会忽略此连接。

您可以在服务器资源管理器中创建另一个连接并将其命名为DebugConnection,在使用DebugConnection检查代码是否按预期执行时仍保留原始连接以进行架构更改

作为附注,如果在项目项之间列出了MDF文件,请特别注意属性Copy To the Output Directory属性。如果每次启动调试会话时将其设置为Copy Always,则会将数据库的新副本从项目目录复制到输出目录,从而有效地破坏代码执行的更新。我建议将其设置为Copy Never并手动处理数据库架构更改

参考:Where is DataDirectory

答案 1 :(得分:-1)

您可以尝试在C#part

中创建SQLTransaction

另外,尝试更改代码,如 -

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