.NET SqlConnection и SqlCommand - PullRequest
0 голосов
/ 04 мая 2011

Я использую классы SqlConnection и SqlCommand в своем проекте с Dapper ORM, но у меня странная проблема.Когда я использую SqlCommand для вставки строки в таблицу базы данных, она всегда работает правильно, и когда я выбираю обновленные таблицы формы данных, все в порядке, но после закрытия внесенные мной изменения приложения не фиксируются, поскольку данные были сохранены в некотором кеше.Например, я создал простую таблицу с двумя столбцами (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 ]

1 голос
/ 05 мая 2011

Этот код в dapper должен быть:

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

Dapper не управляет внутренней транзакцией, его необходимо передать с использованием необязательного параметра транзакции.

Моя интуиция говорит мне, что вы подключаетесь к другой базе данных для вставки данных.Либо тот из неявных транзакций Дэмиенса, который легко проверить.

1 голос
/ 04 мая 2011

Предположительно, по умолчанию для вашего сервера установлено так, что неявные транзакции были включены. Это означает, что если вы выполняете команду и в настоящее время открытая транзакция не выполняется, SQL Server автоматически запускает транзакцию (как всегда). Но когда команда завершается успешно, эта транзакция остается открытой и требует явной фиксации.

Чтобы определить, так ли это, попробуйте запросить @@OPTIONS:

IF @@OPTIONS & 2 > 0 
RAISERROR ('Implicit transactions are turned on', 1, 1)
1 голос
/ 04 мая 2011

Скорее всего, вы находитесь в транзакции, которая не совершена. Возможно, Dapper ORM запустил транзакцию, и вы должны сказать ей, чтобы все изменения были зафиксированы.

0 голосов
/ 04 мая 2011

Возможно, база данных автоматически создает транзакцию, которая не фиксируется, попробуйте создать свою собственную транзакцию в коде и зафиксировать ее вручную и посмотреть, работает ли она

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