0

我面临一个问题。就我而言,我想选择 max 和 + 1 来创建一个新的收据编号,如果它是一个新的收据,它将创建一个新的编号,如下所示的代码。但是,我收到了错误

对象不能从 DBNull 转换为其他类型

这是我的代码。

这个系统在 PDA 上运行,所以我使用这个 web 服务来调用数据库

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

4 回答 4

1

尝试这个:

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

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

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

于 2016-01-11T10:38:16.590 回答
1

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();
于 2016-01-11T10:38:27.680 回答
1

使用ISNULL运算符。

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

注意:请使用字符串连接的参数!

于 2016-01-11T10:38:32.187 回答
0

在您的选择查询之后运行SELECT @@ROWCOUNT,这将返回您之前查询中受影响的记录数

于 2016-01-11T11:42:50.923 回答