Если база данных не имеет записи, вернуть объявленный int

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

Объект не может быть приведен из DBNull к другому типу

вот мой код

эта система работает на КПК, поэтому я использую этот веб-сервис для вызова базы данных

public string callReceipt(string terminal, ref string msg)
    {
        try
        {
            string sql = "Select MAX(ReceiptNo) from ReceiptStore where terminalno ='" + terminal + "'";
            Logging.Log.writeLog(sql);
            msg = "Success";
            int receiptno = Convert.ToInt32(Data.DAL.ExecuteScalar(sql));
            if (!(sql is DBNull))
            {
                return Convert.ToString(receiptno + 1);
            }
            else
            {
                int receipt = 100000;
                return receipt.ToString();
            }
        }
        catch (Exception e)
        {
            msg = "Error : " + e.Message.ToString();
            Logging.Log.writeLog(msg);
            return msg;
        }
        finally
        {

        }
    }

****** ОБНОВИТЬ ******

Спасибо за все ответы, SimpleVar предоставил правильный ответ и решил мою проблему. еще раз спасибо!

4 ответа

Решение

Попробуй это:

object o = Data.DAL.ExecuteScalar(sql);
if (o is int)
{
    return ((int)o + 1).ToString();
}
else
{
    int receipt = 100000;
    return receipt.ToString();
}

Кроме того, вы должны изучить хранимые процедуры и подготовленные запросы.

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

Используйте оператор ISNULL.

Select MAX(ISNULL(ReceiptNo,0)) from ReceiptStore

Примечание. Пожалуйста, используйте параметры, указанные в конкатенации строк!

sql никогда не может быть DBNullтак как первое - это просто укус, а не результат запроса. Ошибка возникает потому, что вы хотите конвертировать Data.DAL.ExecuteScalar(sql) к int, который не будет работать, если ExecuteScalar ничего не возвращает (или в частности возвращает DBNull).

Вы должны проверить результат этого метода против DBNull:

var o = Data.DAL.ExecuteScalar(sql);
int receiptno;

if (!(o is DBNull)) receiptno = Convert.ToInt32(o) + 1;
else receiptno = 100000;

return receiptno.ToString();

runn SELECT @@ ROWCOUNT после вашего запроса select, который вернет вам количество затронутых записей в вашем предыдущем запросе

Другие вопросы по тегам