【问题标题】:c# sql stored procedure isn't committingc#sql存储过程没有提交
【发布时间】:2014-01-31 05:37:02
【问题描述】:

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

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

【问题讨论】:

  • 您在寻找正确的数据库吗?此外,如果您将那些已弃用的用户实例与 .mdf 文件一起使用,并且它包含在您的项目中,并且“复制到输出目录”设置为 true,那么每次构建项目时,该副本都会覆盖 bin 文件夹中的那个。
  • 如果这是问题,我如何将其设置为 false?我不知道那个设置在哪里。
  • 好吧,如果您的项目中包含 .mdf,请在解决方案资源管理器中单击它并按 alt+enter(至少“常规开发”是这样),您应该会看到该项目属性出现
  • 我试过了,没有解决问题。
  • 不,不一样。检查你的 BIN\DEBUG\DATA 文件夹,你会在那里找到一个 MDF

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


【解决方案1】:

您可以尝试在 C# 部分创建 SQLTransaction

另外,尝试更改您的代码,例如 -

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

【讨论】:

  • @CyanideGiraffe - 尝试上述解决方案
  • 我尝试创建一个事务,但没有成功。其次,我在初始化对象时已经设置了命令文本。见第 9 行和第 10 行
  • 从那里删除设置命令文本 - 按照上面的答案添加。另外,你能调试一下,看看returnedValue的值是多少
  • 存储过程正在运行。它返回数字 2。因为这将是下一个逻辑 ID,因为此表中只有记录。
  • llBorrowers 上是否定义了任何触发器?
【解决方案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 表示“您需要查看正确的数据库,而不是每次都覆盖它...”,用与您所做的一样多的话。
  • @ta.speot.is 是的,即使我的妻子说我太冗长 :-)(这里没有提供终止开关)
猜你喜欢
  • 2020-02-24
  • 2020-10-08
  • 2019-04-17
  • 2014-04-07
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多