Невозможно вставить данные в базу данных SQL с помощью C # - PullRequest
2 голосов
/ 21 ноября 2011

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

public void AddStudent(string name, string teachName, string pass)
{
    string dbfile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + "\\Logo.sdf";
    SqlCeConnection connection = new SqlCeConnection("Data Source=" + dbfile + "; Password = 'dbpass2011!'");
    connection.Open();

    SqlCeTransaction transaction = connection.BeginTransaction();
    SqlCeCommand command = connection.CreateCommand();
    command.Transaction = transaction;
    command.CommandText = "INSERT INTO Students VALUES ('@name', '@id', '@pass', '@tname')";
    command.Parameters.Add("@name", name);
    command.Parameters.Add("@id", this.ID);
    command.Parameters.Add("@pass", MD5Encrypt.MD5(pass));
    command.Parameters.Add("@tname", teachName);


    command.Prepare();
    command.ExecuteNonQuery();
    transaction.Commit();
    connection.Dispose();
    connection.Close();
}

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

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

Любая обратная связь будет принята с благодарностью!

Ответы [ 3 ]

4 голосов
/ 21 ноября 2011
command.CommandText = "INSERT INTO Students VALUES ('@name', '@id', '@pass', '@tname')";

Вы должны удалить лишние одинарные кавычки - это должно быть:

command.CommandText = "INSERT INTO Students VALUES (@name, @id, @pass, @tname)";

Также я не уверен, почему вы открываете транзакцию для одной вставки - это тоже не нужно.

2 голосов
/ 21 ноября 2011

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

command.CommandText = "INSERT INTO Students VALUES (@name, @id, @pass, @tname)";

Кроме того, лучше явно указать тип параметра, размер и значение, как показано ниже:

SqlCeParameter param = new SqlCeParameter("@name", SqlDbType.NVarChar, 100);
param.Value  = name; // name is a variable that contain the data of name field
//param.Value  = 'Jhon Smith';  //Directly value also can be used

Надеюсь, это будет полезно, спасибо за ваше время.

2 голосов
/ 21 ноября 2011

Скорее всего, в вашем коде возникает исключение;вам нужно добавить обработчик try / catch и / или отладить приложение, чтобы точно выяснить, что происходит.

Однако в вашем коде есть как минимум две проблемы:

Перед вызовом Prepare укажите тип данных каждого параметра в операторе, который нужно подготовить.Для каждого параметра, имеющего тип данных переменной длины, необходимо установить для свойства Size максимальный необходимый размер.Prepare возвращает ошибку, если эти условия не выполняются.

  • Необходимо закрыть соединение перед его утилизацией (однако это не повлияет на вставку).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...