Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#sql存储过程是';不承诺_C#_Sql_Sql Server_Stored Procedures_Commit - Fatal编程技术网

c#sql存储过程是';不承诺

c#sql存储过程是';不承诺,c#,sql,sql-server,stored-procedures,commit,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.CommandT

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

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

您可以尝试在C#part中创建一个SQLTransaction

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

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

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

在调试中,DataDirectory指向PROJECTFOLDER\BIN\DEBUG(如果是x86变体)。
所以很容易被这个愚弄。您在服务器资源管理器中创建了一个连接,但在其他数据库上工作的代码会忽略此连接

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

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


参考资料:

@CyanideGiraffe-尝试上述解决方案我尝试创建一个事务,但没有成功。其次,在初始化对象时,我已经设置了命令文本。请参见第9行和第10行,从中删除设置命令文本-按照上面的答案添加。另外,您可以调试并查看存储过程正在运行的ReturnedValues的值是多少。它正在返回数字2。因为这将是下一个逻辑ID,因为此表中只有记录。是否在LL借款人上定义了任何触发器?是否正在查看正确的数据库?另外,如果您使用的是那些不推荐使用的用户实例的.mdf文件,并且该文件包含在您的项目中,且“复制到输出目录”设置为true,则每次生成项目时,该副本都将覆盖bin文件夹中的一个。如果出现此问题,如何将其设置为false?我不知道该设置在哪里。如果您的项目中包含了.mdf,请在解决方案资源管理器中单击它,然后按alt+enter(至少这是“常规开发”的设置),您应该会看到项目属性。如果您尝试了该设置,它并没有解决问题。不,它是不同的。检查你的BIN\DEBUG\DATA文件夹,你会发现那里有一个MDF+1,用和你一样多的词说“你需要查看正确的数据库,不要每次都覆盖它…”。@ta.speot.is是的,甚至我妻子说我太冗长:-)(这里没有提供关闭开关)