Как сохранить изменения обратно в базу данных? - PullRequest
2 голосов
/ 25 июня 2011

У меня есть база данных в моем проекте c #, и у меня есть небольшая проблема с этим.Я могу прочитать данные из базы данных и показать их, но когда я использую SQL-запрос, такой как вставка / обновление / удаление, изменения не сохраняются обратно в файл базы данных, и через несколько минут они просто исчезают ...

Небольшой пример кода:

DataSet ds = new DataSet();
string sql_string = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True";
string sql = "INSERT INTO Table1 (name, time, needs, text) VALUES ('string', 'string', 'string', 'string')";
SqlConnection conn = new SqlConnection(sql_string);
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(ds); ;
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();         
conn.Close();

Теперь я понимаю, что мне нужно использовать SqlDataAdapter.update () для сохранения изменений, но я не знаю, как его использовать?

Ответы [ 4 ]

4 голосов
/ 25 июня 2011

Если вы используете DataSet , после того, как вы заполните DataSet из базы данных, вы должны распространить эти изменения обратно, чтобы обновить базу данных. DataSet - это объект времени выполнения, хранящийся в памяти.

Если вы просто выполняете SQL-рекомендацию для обновления базы данных, то это просто (используйте using statement и Parameters.Add вместо того, чтобы помещать значения непосредственно в оператор SQL, чтобы избежать внедрения):

using (SqlCeConnection conn = new SqlCeConnection(connString))
{
    string sqlStr = @"INSERT INTO FooTable (FooName) VALUES (@FooName)";
    using (SqlCeCommand cmd = new SqlCeCommand(sqlStr, conn))
    {
        try
        {
            conn.Open();
            cmd.Parameters.AddWithValue("@FooName", 'someString');

            cmd.ExecuteNonQuery();

            conn.Close();
        }
        catch (SqlCeException se)
        {
            MessageBox.Show(se.ToString());
        }
    }
}
1 голос
/ 10 января 2012

Я выкапываю этот вопрос, потому что правильный ответ не ясно описан (пожалуйста, прочитайте всю ветку, если вы не согласны): наиболее близким к правильному является на самом деле jfuhr.

Я столкнулся с проблемой, идентичной той, которая впервые была описана в ОП, т.е.

  • Можно подключиться к БД
  • Может извлекать все записи (или подмножество) из БД
  • Появляется , чтобы иметь возможность записывать изменения в БД (и даже использовать отдельный элемент управления сеткой данных, который извлекает все записи из БД, включая те, которые вы добавили / отредактировали для подтверждения этого)
  • Однако изменения как-то не распространяются на БД - перезапуск всей IDE (или проверка через SQL Server Management Studio) показывает, что новые записи не были сохранены.

В моем случае эта проблема возникла, несмотря на использование проверенных примеров кода, которые отлично работали в других местах.

Решение состоит в том, чтобы изменить путь в строке подключения с:

AttachDbFilename=|DataDirectory|...Database.mdf

к абсолютному пути:

AttachDbFilename=C:\\Users\\Me\\Projects\\MyProject\\MyDatabase.mdf
0 голосов
/ 25 июня 2011

Код KMC должен обновить вашу таблицу.

Единственное, о чем я могу думать, это то, что в вашей строке соединения у вас есть AttachDbFilename = | DataDirectory | \ Database.mdf;

Но этопохоже, что вы подключаетесь к экземпляру SQLExpress.Попробуйте удалить это и из строки conn.Когда вызывается ExecuteNonQuery, изменения происходят немедленно.

0 голосов
/ 25 июня 2011

Ознакомьтесь с этой статьей . В ней приведен хороший пример использования SqlDataAdapter для выбора и обновления данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...