2016-01-11 90 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,將返回你的受影響的記錄數在以前的查詢

相關問題