我在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();
}
您很可能处于未提交的事务中。也许Dapper ORM已经启动了一个事务,您必须告诉它提交所有更改。
我猜,您的服务器的默认设置已经启用了隐式事务。这意味着,如果你执行一个命令,而当前没有事务是打开的,SQL Server将自动启动一个事务(一如既往)。但是,当命令成功完成时,该事务将保持打开状态,并且需要发出显式提交。
要确定是否存在这种情况,请尝试查询@@OPTIONS
:
IF @@OPTIONS & 2 > 0
RAISERROR ('Implicit transactions are turned on', 1, 1)
dapper中的代码应该是:
var name = "SomeName";
int t = c.Execute("INSERT INTO Users (UserName) VALUES (@name)", new {name});
Dapper没有内部事务管理,它必须使用可选的transaction参数传入。
我的直觉告诉我你正在连接到不同的数据库来插入数据。或者是Damiens的隐式事务,这很容易验证。
可能是数据库自动创建了一个未提交的事务,尝试在代码中创建自己的事务并手动提交,看看是否有效
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();
}
}