Попытка вставить данные в базу данных доступа из C #, но это не удается, и я понятия не имею, почему - PullRequest
0 голосов
/ 23 мая 2018

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

Вот этот код:

string connString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=[[Rather not release private information, but trust me, this part works]]";

var _ID = LblID.Text;
var _FirstName = TxtUsername.Text;
var _LastName = TxtPassword.Text;
var _DOB = TxtFirstName.Text;
var _Number1 = TxtLastName.Text;
var _Number2 = TxtDOB.Text;
var _Email = TxtNumber2.Text;
var _Username = TxtEmail.Text;
var _Password = TxtNumber1.Text;

using (OleDbConnection conn = new OleDbConnection(connString))
{

    OleDbCommand cmd = new OleDbCommand("INSERT into Users ([_ID], [_FirstName], [_LastName], [_DOB], [_Number1], [_Number2], [_Email], [_Username], [_Password]) Values(@ID Number, @First Name, @Last Name, @Date of Birth, @Phone Number 1, @Phone Number 2, @Email, @Username, @Password)");

    cmd.Connection = conn;

    conn.Open();

    if (conn.State == ConnectionState.Open)
    {
        cmd.Parameters.Add("@ID Number", OleDbType.VarChar).Value = _ID;
        cmd.Parameters.Add("@First Name", OleDbType.VarChar).Value = _FirstName;
        cmd.Parameters.Add("@Last Name", OleDbType.VarChar).Value = _LastName;
        cmd.Parameters.Add("@Date of Birth", OleDbType.VarChar).Value = _DOB;
        cmd.Parameters.Add("@Phone Number 1", OleDbType.VarChar).Value = _Number1;
        cmd.Parameters.Add("@Phone Number 2", OleDbType.VarChar).Value = _Number2;
        cmd.Parameters.Add("@Email", OleDbType.VarChar).Value = _Email;
        cmd.Parameters.Add("@Username", OleDbType.VarChar).Value = _Username;
        cmd.Parameters.Add("@Password", OleDbType.VarChar).Value = _Password;

        try
        {
            cmd.ExecuteNonQuery();
            MessageBox.Show("Data Added");
            conn.Close();
        }
        catch (OleDbException ex)
        {
            MessageBox.Show(ex.Message);
            conn.Close();
        }
    }
    else
    {
        MessageBox.Show("Connection Failed");
    }
}

Это немного долго, но оставайтесь со мной здесь.

Этот код очень похож на тот, который я нашел из ответа на предыдущий вопрос Конечно, переименование переменных и тому подобное для интеграции кода в мое приложение.

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

try
{
    cmd.ExecuteNonQuery();
    MessageBox.Show("Data Added");
    conn.Close();
}

Точнее, cmd.ExecuteNonQuery ().

Кажется, что попытка останавливается на этой части и пропускает прямо к улову.

У меня вопрос, что яделать неправильно?Насколько сильно я это запутал?

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

Заранее спасибо.

Редактировать 1: Забыл добавить сообщение об ошибке, мои извинения.

"Синтаксическая ошибка (отсутствует оператор) в выражении запроса '@ID Number'."

Редактировать 2: Не уверен, если этодолжно быть редактирование, но теперь у меня возникает совершенно новая проблема.

После прочтения комментариев я изменил названия областей (как в приложении, так и в базе данных), и теперь я получаюсовершенно новое сообщение об ошибке.

"Оператор INSERT INTO содержит следующее неизвестное имя поля: '_ID'."

У меня такое чувство, что он будет жаловаться на остальных.

Извините за все неприятности.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Как указывает исключение, вы пропускаете запятую в вашем списке VALUES сразу после параметра @ID.

Для вашего второго сообщения об ошибке: у вас есть столбец в таблице базы данных, которыйс именем _ID?

Кроме того, вам не нужно явно закрывать соединение, поскольку вы уже используете , используя оператор для db-соединения.

0 голосов
/ 23 мая 2018

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

... VALUES (@IDNumber, @FirstName, @LastName, ...)

cmd.Parameters.Add("@IDNumber", OleDbType.VarChar).Value = _ID;
cmd.Parameters.Add("@FirstName", OleDbType.VarChar).Value = _FirstName;
cmd.Parameters.Add("@LastName", OleDbType.VarChar).Value = _LastName;

"Оператор INSERT INTO содержит следующее неизвестное имя поля: '_ID'."

Это происходит потому, что _ID не совпадает с именем столбца в вашей базе данных.В отличие от имен параметров, которыми вы полностью управляете, имена столбцов являются частью схемы базы данных, поэтому вам нужно использовать точное имя, включая любые пробелы, которые у него могут быть.Используйте квадратные скобки для имен с пробелами:

INSERT INTO Users ([ID Number], [First Name], ... ) ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...