Ошибка при отправке данных в базу данных Access

Nov 30 2020

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

System.Data.OleDb.OleDbException (0x80040E07): несоответствие типа данных в выражении условия выбора

при System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult ч)
при System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult (tagDBPARAMS dbParams, Object & executeResult)
в System.Data.OleDb.OleDbCommand.ExecuteCommandText (Object & executeResult)
в System.Data. OleDb.OleDbCommand.ExecuteCommand (CommandBehavior поведение, объект и executeResult)
на System.Data.OleDb.OleDbCommand.ExecuteReaderInternal (поведение CommandBehavior, метод String)
в System.Data.OleDb.OleDbCommand.ExecuteNonQuery ()
в KPIZ.Form2.btn_save_Click (отправитель объекта , EventArgs e) в C: \ Users \ booku \ source \ repos \ KPIZ \ KPIZ \ Form2.cs: строка 110

Мой код:

private void btn_save_Click(object sender, EventArgs e)
{
        try
        {
            byte[] imageBt = null;
            FileStream fstream = new FileStream(this.textBox2.Text, FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fstream);
            imageBt = br.ReadBytes((int)fstream.Length);

            connection.Open();

            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            command.CommandText = @"INSERT INTO [SportInfo]([ID],[FirstName],[LastName],[DOB],[Sport],[DIW],[Image])" + "VALUES(@id, @Fn, @Ln, @Date, @Sports, @days ,@IMG)";
            
            command.Parameters.Add(new OleDbParameter("@Fn", Convert.ToString(txt_fname.Text)));
            command.Parameters.Add(new OleDbParameter("@Ln", Convert.ToString(txt_lname.Text)));
            command.Parameters.Add(new OleDbParameter("@Date", Convert.ToString(mtxt_dob.Text)));
            command.Parameters.Add(new OleDbParameter("@Sports", Convert.ToString(txt_sport.Text)));
            command.Parameters.Add(new OleDbParameter("@days", Convert.ToInt32(nmc_diw.Text)));
            command.Parameters.Add(new OleDbParameter("@id", Convert.ToInt32(txt_id.Text)));
            command.Parameters.Add(new OleDbParameter("@IMG", imageBt));

            command.ExecuteNonQuery();

            MessageBox.Show("Data Saved");
            connection.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Unlucky  " + ex);
            connection.Close();
        }

        try
        {
            connection.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            string query = "select ID,LastName,FirstName,DOB,Sport,DIW, from SportInfo ";
            command.CommandText = query;

            OleDbDataAdapter da = new OleDbDataAdapter(command);
            dt = new DataTable();
            da.Fill(dt);
            dataGridView1.DataSource = dt;

            connection.Close();
        }
}

Ответы

3 ErikA Nov 30 2020 at 13:41

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

Кроме того, вам нужно добавить параметр даты как дату, а не строку.

Измените порядок параметров, чтобы он соответствовал:

        command.Parameters.Add(new OleDbParameter("@id", Convert.ToInt32(txt_id.Text)));
        command.Parameters.Add(new OleDbParameter("@Fn", Convert.ToString(txt_fname.Text)));
        command.Parameters.Add(new OleDbParameter("@Ln", Convert.ToString(txt_lname.Text)));
        command.Parameters.Add(new OleDbParameter("@Date", DateTime.Parse(mtxt_dob.Text)));
        command.Parameters.Add(new OleDbParameter("@Sports", Convert.ToString(txt_sport.Text)));
        command.Parameters.Add(new OleDbParameter("@days", Convert.ToInt32(nmc_diw.Text)));
        command.Parameters.Add(new OleDbParameter("@IMG", imageBt));

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