Если база данных не имеет записи, вернуть объявленный 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, который вернет вам количество затронутых записей в вашем предыдущем запросе