Оператор INSERT влияет на 1 строку, но VS Server Explorer показывает, что он фактически не обновляет базу данных SQL CE - PullRequest
1 голос
/ 09 июля 2011

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

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

Таблица, которую нужно изменить, называется users.Он имеет 3 столбца: ID, name, email.

Вот код, который я использую:

string connection = Properties.Settings.Default.LocalDBConnectionString;

using (var con = new SqlCeConnection(connection))
{
    con.Open();

    // (I also tried adding with parameters but couldn't get it working.)
    using (var com = new SqlCeCommand("INSERT INTO users (name, email) " +
                                      "VALUES (N'jimmy', N'email@jim.com')", con))
    {
        int numRowsAffected = com.ExecuteNonQuery();

        // This returns '1 row affected' but doesn't actually update the database
        Console.WriteLine(numRowsAffected);
        Console.ReadKey();
    }
}

Хотя консоль выводит 1, потому что 1Строка влияет, когда я возвращаюсь в базу данных и проверяю, не вставлены ли новые данные.

Я читал этот урок , но не работает только чтение, вставка или запись.

Я также нашел этот похожий вопрос переполнения стека, но, используя параметры, все равно не смог заставить его работать.


Редактировать:

Моя строка подключения:

Data Source=|DataDirectory|\LocalDB.sdf

Я не знаю, как найти параметры сборки, это локальная база данных, созданная в консольном приложении. Она хранится в каталоге проекта.

Я нахожусь в конфигурации «Отладка»если это поможет?


Вот еще один пример, который я нашел в Интернете :

SqlCeConnection con = new SqlCeConnection(Properties.Settings.Default.LocalDBConnectionString);
con.Open();

SqlCeCommand comInsert = new SqlCeCommand ("INSERT INTO users(name, email) VALUES('value 1', 'value 2')", con);
comInsert.ExecuteNonQuery();

SqlCeCommand comSelect = new SqlCeCommand("SELECT * FROM users", con);
SqlCeDataReader reader = comSelect.ExecuteReader();

while (reader.Read())
{
    Console.WriteLine("{0} {1}", reader["name"], reader["email"]);
    Console.ReadKey();
}

con.Close();

Я просто скопировал и вставил это, и изменил основнойпеременные.В этом примере данные временно вставляются, но когда я захожу в обозреватель серверов Visual Studio и просматриваю таблицу, они не обновляются.

Ответы [ 3 ]

4 голосов
/ 09 июля 2011

Вы уверены, что база данных, в которую вы INSERT обращаетесь, и база данных, которую вы просматриваете в обозревателе серверов, совпадают?

Помните, мы говорим здесь о файловой БД (SQL Server CE ). Так что может быть, вы INSERT копируете свою базу данных, а затем смотрите на (неизменный) оригинал. Является ли файл БД частью вашего решения? Если да, копируется ли это в выходной каталог (например, bin\Debug)? Проверьте свойства соответствующего элемента решения, как на скриншоте ниже (извините за то, что он на немецком языке):

Screenshot showing a 'Local Database' project item and its 'Copy to output directory' property setting

Куда именно указывает DataDirectory в строке подключения? Если вы не уверены, замените его на что-то абсолютное и посмотрите, решит ли это вашу проблему.

Убедитесь, что ваша строка подключения действительно указывает на базу данных, которую вы просматриваете с помощью обозревателя сервера!

1 голос
/ 03 апреля 2013

Я полагаю, что проблема здесь: Data Source=|DataDirectory|\LocalDB.sdf Когда вы запускаете вашу программу из Visual Studio, она подключается к базе данных в каталоге Debug (или Release), а не к той базе данных, которая есть в каталоге проекта.Итак, попробуйте использовать полный путь вместо Data Source=|DataDirectory|\LocalDB.sdf, попробуйте что-то вроде этого: Data Source=C:\Visual Studio 2008\Projects\MyProject\LocalDB.sdf.У меня это сработало.

0 голосов
/ 28 октября 2011

Я проверил строку подключения обозревателя решений и вставил ее в файл кода, и моя проблема была решена, поэтому внесите изменения в строку подключения.

...