Datatable rows.count == 0 дает 1, хотя в таблице не найдено записей - PullRequest
0 голосов
/ 13 марта 2019

У меня проблема, и я не знаю, почему это происходит!

Я пытаюсь найти значение Max в столбце таблицы базы данных, я использую этот код:

private void FrmCustomer_New_Load(object sender, EventArgs e)
{
    int NewID;           
    DataTable _Dt = CusVar.GetCustomersIDs();
    if (_Dt.Rows.Count == 0)
    {
        NewID = 1;
        this.txt1.Text = NewID.ToString();
        DataRow _Row = CusVar.GetCustomersIDs().Rows[0];
        MessageBox.Show(Convert.ToString(_Dt.Rows[0]["MaxID"]));
    }
}

код работает, но выдает 1, хотя в таблице нет записей?Я использую C # и базу данных Access ACCDB.

Я использую эту функцию в Cls_Customers:

public DataTable GetCustomersIDs()
{
    DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
    DataTable Dt = new DataTable();
    Dt = DAL.DataSelect("Select Max(CustomerID) AS MaxID From TblCustomers", null);
    DAL.CloseConn();
    return Dt;
}

В чем проблема, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 13 марта 2019

Это ваш запрос:

Select Max(CustomerID) AS MaxID
From TblCustomers

Это запрос агрегации.Запросы агрегации без group by всегда возвращают одну строку - независимо от того, совпадают ли какие-либо строки.

Значение, возвращаемое в одной строке: NULL для MaxId.

Яочень подозрительно к тому, что вы хотите сделать.Если вам нужен максимальный идентификатор - и никаких строк, если таблица пуста - тогда выполните:

select c.CustomerID
from TblCustomers c
order by c.CustomerID desc
fetch first 1 row only;

(при этом используется стандартный синтаксис ANSI / ISO, поэтому точная логика может зависеть от вашей базы данных.)

Я подозреваю, что вы хотите использовать этот идентификатор для insert - и это плохой подход.Почти все базы данных поддерживают какой-то столбец с автоинкрементом (с элементами синтаксиса, такими как auto_increment, serial или identity).Это правильный способ присвоения уникального инкрементного идентификатора столбцу в таблице.

0 голосов
/ 13 марта 2019

Попробуйте сделать следующее: ВЫБЕРИТЕ МАКС. (T1.CustomerID) КАК МАКСИМАЛЬНЫЙ ОТ TblCustomers T1

0 голосов
/ 13 марта 2019

Sql-запрос может возвращать ноль, и если нет строк, соответствующих критериям.

Если предполагается найти число возвращаемых строк. Измените SQL-запрос, чтобы он возвращал счетчик вместо использованияагрегатная функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...