Joey Arnanzo Ответов: 1

Доступ к таблице запрос к БД дает несоответствие типов данных ошибка c#


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

вот код

 private void button1_Click(object sender, EventArgs e)
 {
     getsum();
 }



public void getsum()
{
    string query = @"select SUM(SQuantity) AS Total FROM Sales where Sdate=@date AND Staffid=@mobile";
    using (var conn = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data source=|DataDirectory|\\crepeDB.accdb;"))
          using (var cmd = new System.Data.OleDb.OleDbCommand(query, conn))
          {
            cmd.Parameters.Add("@mobile", System.Data.OleDb.OleDbType.VarChar).Value = '1';
            cmd.Parameters.Add("@date", System.Data.OleDb.OleDbType.VarChar).Value = dateTimePicker1.Value.Date;

            conn.Open();

            using (var rdr = cmd.ExecuteReader())
            {
                if (rdr.Read())
                {
                    textBox1.Text = rdr["Total"].ToString();
                }
                rdr.Close();
            }
        }
}


Что я уже пробовал:

Я пробовал его без условия Where, и он работал нормально, код был таким

 private void button1_Click(object sender, EventArgs e)
 {
     getsum();
 }



public void getsum()
{
    string query = @"select SUM(SQuantity) AS Total FROM Sales";
    using (var conn = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data source=|DataDirectory|\\crepeDB.accdb;"))
          using (var cmd = new System.Data.OleDb.OleDbCommand(query, conn))
          {
            cmd.Parameters.Add("@mobile", System.Data.OleDb.OleDbType.VarChar).Value = '1';
            cmd.Parameters.Add("@date", System.Data.OleDb.OleDbType.VarChar).Value = dateTimePicker1.Value.Date;

            conn.Open();

            using (var rdr = cmd.ExecuteReader())
            {
                if (rdr.Read())
                {
                    textBox1.Text = rdr["Total"].ToString();
                }
                rdr.Close();
            }
        }
}

1 Ответов

Рейтинг:
9

Richard Deeming

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

Попробуйте добавить параметры в том же порядке, в котором они появляются в запросе. Вы также захотите указать правильный тип для вашего @date параметр.

using (var cmd = new System.Data.OleDb.OleDbCommand(query, conn))
{
    cmd.Parameters.Add("@date", System.Data.OleDb.OleDbType.Date).Value = dateTimePicker1.Value.Date;
    cmd.Parameters.Add("@mobile", System.Data.OleDb.OleDbType.VarChar).Value = '1';
}


Joey Arnanzo

Попробовал этот код, та же проблема, несоответствие типа данных в выражении критериев

Richard Deeming

Каковы типы Sdate и StaffId столбцы в вашей базе данных?

Joey Arnanzo

Sdate = Дата/Время
Staffid = Номер

Richard Deeming

Так что измените тип для @mobile параметр to OleDbType.Integer, и установите значение в целое число, а не в строку:

cmd.Parameters.Add("@mobile", System.Data.OleDb.OleDbType.Integer).Value = 1;


Я бы также предложил изменить имя параметра, так как использование параметра под названием "Мобильный" для указания "StaffId"приведет к путанице. :)

Joey Arnanzo

Я пробовал это сделать, но все равно выдает ошибку, наверное, это параметр даты

Richard Deeming

Если OleDbType.Date не работает, и вы не заботитесь о времени, попробуйте OleDbType.DBDate.

Кажется, я припоминаю похожую проблему несколько лет назад, но я уже очень давно не работал с Access. :)

Joey Arnanzo

Спасибо за совет, но как насчет параметра даты, который является главной проблемой?

Joey Arnanzo

Ну, когда я это делаю, это не дает никакого результата

Richard Deeming

Что ж, это прогресс! По крайней мере, мы избавились от ошибки. :)

Теперь, если запрос не возвращает никаких результатов, это означает, что в базе данных нет соответствующих записей.

Делает ли это Sdate колонка содержит просто дата, или она также содержит время?

Если он содержит время, вам нужно будет изменить свой запрос:

select SUM(SQuantity) AS Total FROM Sales where Staffid = @Staffid AND Sdate >= @date AND Sdate < @nextdate

А затем измените свои параметры:
cmd.Parameters.Add("@Staffid", System.Data.OleDb.OleDbType.Integer).Value = 1;
cmd.Parameters.Add("@date", System.Data.OleDb.OleDbType.DBDate).Value = dateTimePicker1.Value.Date;
cmd.Parameters.Add("@nextdate", System.Data.OleDb.OleDbType.DBDate).Value = dateTimePicker1.Value.Date.AddDays(1);

Joey Arnanzo

Отлично, это отлично сработало, большое спасибо.

как я могу применить это и к datagridview?