如果数据库没有记录,则返回声明的int

时间:2016-01-11 10:34:09

标签: c# web-services sql-server-2008 pushdown-automaton

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

  

无法将对象从DBNull强制转换为其他类型

这是我的代码。

  

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

public static CursorLoader getAlbumsByGenre(Context context, int genreId) {
    Uri uri = MediaStore.Audio.Genres.Members.getContentUri("external", genreId);
    String selection = MediaStore.Audio.Media.ALBUM + " IS NOT NULL) GROUP BY (" + MediaStore.Audio.Media.ALBUM;

    return new CursorLoader(context, uri, null, selection, null, null);
}

******更新******

感谢所有的答案,SimpleVar提供了正确的答案,它解决了我的问题。再次感谢!

4 个答案:

答案 0 :(得分:1)

试试这个:

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

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

对于递增密钥,您不应该使用任何一个,但使用自动递增id列的相应数据库功能。

答案 1 :(得分:1)

sql永远不会是DBNull,因为第一个是简单的刺痛,而不是查询的结果。发生此错误的原因是您希望将Data.DAL.ExecuteScalar(sql)转换为int,如果ExecuteScalar未返回任何内容(或特别是返回DBNull),则该int将无效。

您必须针对DBNull检查该方法的结果:

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

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

return receiptno.ToString();

答案 2 :(得分:1)

使用ISNULL运算符。

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

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

答案 3 :(得分:0)

选择查询后

runn SELECT @@ ROWCOUNT 将返回您之前查询中受影响记录的数量