2016-01-11 50 views
0

我正面临一个问题。在我的情况下,我想选择max和+ 1以创建新的收据编号,如果它是新收据,它将创建一个新的编号,如下面的代码所示。然而,我发现了错误如果数据库没有记录,则返回一个声明的int

对象不能从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 
     { 

     } 
    } 

****** UPDATE ******

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

+0

这将是更好地使用存储过程,而不是增加在客户端的价值。否则,这是一个竞争条件(1 - 另一个应用程序可以访问'ReceiptStore' 2 - 此应用程序由多个用户使用3-数据库直接访问)。 –

+0

马克SimpleVar的作为正确的一个,而不是更新你的问题或upvote有用的。 – HimBromBeere

+0

@HimBromBeere我接受了,在此之前我无法接受,因此要求我等待几分钟。不用担心,我会永远接受正确的答案。感谢提醒 – TheButterfly

回答

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

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(); 
1

使用ISNULL运营商。

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

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

+1

'Coalesce'(而不是'ISNULL')可能是一个更好的解决方案,因为它是一个SQL * 92 *(因此可以在RDBMS中进行划分) –

0

银行经营SELECT @@您选择查询之后ROWCOUNT,将返回你的受影响的记录数在以前的查询

相关问题