.NET SqlConnection和SqlCommand

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

我在项目中使用了SqlConnection和SqlCommand类以及Dapper ORM,但我遇到了一个奇怪的问题。当我使用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已经启动了一个事务,您必须告诉它提交所有更改。

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

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

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


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

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


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

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();
   }
}

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

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();
   }
}

此代码在dapper中应为:

var name = "SomeName";
int t  = c.Execute("INSERT INTO Users (UserName) VALUES (@name)", new {name});
Dapper不进行内部事务管理,必须使用可选事务参数传入


我的直觉告诉我你正在连接一个不同的数据库来插入数据。Damien的隐式事务内容,易于验证。

这段代码应该是:

var name = "SomeName";
int t  = c.Execute("INSERT INTO Users (UserName) VALUES (@name)", new {name});
Dapper不进行内部事务管理,必须使用可选事务参数传入


我的直觉告诉我你正在连接一个不同的数据库来插入数据。Damien的隐式事务内容,很容易验证。

放在一边:c.Close();行是多余的,这将由外部using子句处理;行是多余的,这将由outer using子句负责。为了明确起见,我制作了一个简单的控制台应用程序,上面只有代码,但仍然存在相同的问题。为了明确起见,我制作了一个简单的控制台应用程序,上面只有代码,但仍然存在相同的问题。是否可以使用Dapper获取最后插入的ID?
c.Query(“insert…select SCOPE_IDENTITY()”)。First()
。不确定数字(38)是否干净地映射到
int
@DeveloprMy IDENTITY列在SQL中是int。无论我将Dapper查询设置为什么(int、long等),它都会给我一个“指定的强制转换无效”。Dapper行上的异常:1104 return(T)val;有没有一种方法可以使用execute来执行它,我将它作为输出参数返回,类似于存储过程示例的工作方式?不确定这是否会更干净,但至少是一种替代方法。顺便说一句,无效强制转换是因为它将SQL返回的int视为十进制!现在,我更改了c.查询,它正在工作,尽管如此gh这有点麻烦。是的,是小数点吗?Dapper是一个坚持正确类型设置的人…它不通过指定的方式使用Dapper向下或向上转换来获取最后插入的ID?
c.Query(“插入…选择范围\标识()”)。First()
。不确定是否为数字(38)干净地映射到
int
@DeveloprMy Identity列在SQL中为int。无论我将Dapper查询设置为什么(int、long等),它都会给我一个“指定的强制转换无效”。Dapper行上的异常:1104 return(T)val;有没有一种方法可以使用execute来执行它,我将它作为输出参数返回,类似于存储过程示例的工作方式?不确定这是否会更干净,但至少是一种替代方法。顺便说一句,无效强制转换是因为它将SQL返回的int视为十进制!现在,我更改了c.查询,它正在工作,尽管如此gh这是一个有点混乱。是的,就是它…Dapper是一个有正确类型设置的坚持者…它没有设计的向下或向上投射