0

我在 Dapper ORM 的项目中使用 SqlConnection 和 SqlCommand 类,但我遇到了一个奇怪的问题。当我使用 SqlCommand 在 db 表中插入一行时,它总是正常工作,当我选择更新的数据表单表时,一切都很好,但是关闭应用程序后我所做的更改并没有提交,就像数据已保存在某个缓存中一样。例如,我创建了一个只有两列(UserId (PK) 和 UserName (Unique))的简单表,即使在这种情况下也不会保存更改。我正在使用以下代码插入一行:

using (SqlConnection c = new SqlConnection(Settings.Default.UsersConnectionString))
        {
            c.Open();


            using (SqlCommand d = new SqlCommand())
            {
                d.CommandText = "INSERT INTO Users (UserName) VALUES ('SomeName')";
                d.CommandType = System.Data.CommandType.Text;
                d.Connection = c;
                int t = d.ExecuteNonQuery();
            }


            c.Close();
        }
4

4 回答 4

1

猜测一下,您的服务器的默认设置已设置为启用隐式事务。这意味着,如果您执行命令并且当前没有打开事务,SQL Server 将自动启动事务(一如既往)。但是当命令成功完成时,此事务保持打开状态,需要发出显式提交。

要确定是否是这种情况,请尝试查询@@OPTIONS

IF @@OPTIONS & 2 > 0 
RAISERROR ('Implicit transactions are turned on', 1, 1)
于 2011-05-04T08:45:55.980 回答
1

您很可能处于未提交的事务中。也许 Dapper ORM 已经启动了一个事务,您必须告诉它提交所有更改。

于 2011-05-04T08:07:54.573 回答
1

dapper 中的这段代码应该是:

var name = "SomeName";
int t  = c.Execute("INSERT INTO Users (UserName) VALUES (@name)", new {name});

Dapper 没有内部事务管理,必须使用可选的事务参数传入。

我的直觉告诉我你正在连接到不同的数据库来插入数据。Damiens 的隐式交易内容,很容易验证。

于 2011-05-05T12:54:45.453 回答
0

可能是数据库自动创建了一个未提交的事务,尝试在代码中创建自己的事务并手动提交,看看是否有效

using (SqlConnection c = new SqlConnection(Settings.Default.UsersConnectionString))
{
   c.Open();
   using (SqlTransaction t = c.BeginTransaction("InsertIntoUsers"))
   {
        using (SqlCommand d = new SqlCommand())
        {
            d.CommandText = "INSERT INTO Users (UserName) VALUES ('SomeName')";
            d.CommandType = System.Data.CommandType.Text;
            d.Connection = c;
            int t = d.ExecuteNonQuery();
        }
        t.Commit();
   }
}
于 2011-05-04T09:04:54.207 回答