如果数据库没有记录,return 声明的 int

If database has no record, return a declared int

我遇到了问题。在我的例子中,我想 select max 和 + 1 以创建一个新的收据编号,如果它是一个新的收据,它将创建一个新的编号,如下所示的代码。但是,我收到错误

Object cannot be cast from DBNull to other type

这是我的代码。

this system is running on PDA, so I'm using this web service to call database

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 提供了正确的答案,解决了我的问题。再次感谢!

试试这个:

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

除此之外,您应该查看存储过程和准备好的查询。

对于递增键,您不应使用任何一种,而应使用适当的数据库功能,即 auto-increment id 列。

sql 永远不会是 DBNull 因为第一个是简单的字符串,而不是查询的结果。发生错误是因为您想将 Data.DAL.ExecuteScalar(sql) 转换为一个 int,如果 ExecuteScalar 没有 return 任何东西(或者特别是 returns 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();

使用 ISNULL 运算符。

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

注意:请使用参数代替字符串拼接!

运行 SELECT @@ROWCOUNT 在你的 select 查询之后 return 你之前查询中受影响的记录数