2013-08-18 47 views
2

我有一個包含一些列的數據庫,其中一個名爲ID(數據類型= int)。
我需要知道最後一行的ID的值(最後一行是指最後一行創建的)。從SQL Server CE數據庫的最後一行讀取一個值

我想這一點,但它給出了一個運行時錯誤:

string query = "SELECT * FROM Customer WHERE ID = (SELECT MAX(ID) FROM Customer)"; 
SqlCeCommand comSelect = new SqlCeCommand(query, connection); 
SqlCeDataReader rdr = comSelect.ExecuteReader(); 
int ID = rdr.GetInt32(6); 

GetInt32(6)因爲ID是第6列)

感謝所有,和對不起我的英語。

P.S.

客戶是我的表和ID是按升序設置。創建的第一行ID = 0第二ID = 1

我需要知道的最後一個ID,因爲當我創建一個新的客戶我想他ID設置爲以前的客戶ID+1

錯誤:

Exception of type 'System.Data.SqlServerCe.SqlCeException' in System.Data.SqlServerCe.dll unhandled in user code

+0

而*值你得到它*運行時錯誤? –

+0

System.Data.SqlServerCe.dll中類型'System.InvalidOperationException'的異常 –

+0

異常中的消息是什麼? –

回答

4

鑑於這一事實,有可能是沒有問題的併發你可以簡單地用ExecuteScalar呼叫

string query ="SELECT MAX(ID) FROM Customer"; 
SqlCeCommand comSelect = new SqlCeCommand(query, connection); 
int ID = (int)comSelect.ExecuteScalar(); 

的ExecuteScalar返回第一行的結果集的第一列獲得最後的ID。
查詢SELECT MAX(ID)只返回一列,只有一列。所以ExecuteScalar完全適合這種情況。不需要使用ExecuteReader

但是,處理自動增量場景的正確方法是使用an IDENTITY column,當您插入新記錄時會自動爲您設置下一個值。 在這種情況下,您已將ID列標記爲IDENTITY屬性爲TRUE,然後將您的數據插入表Customer中,而不爲ID列傳遞任何值。您檢索插入後,立即由數據庫分配給您的ID列

string query ="INSERT INTO Customers (Name, Address, .....) VALUES (.....)"; 
SqlCeCommand comInsert = new SqlCeCommand(query, connection); 
comInsert.ExecuteNonQuery(); 
query ="SELECT @@IDENTITY"; 
SqlCeCommand comSelect = new SqlCeCommand(query, connection); 
int ID = (int)comSelect.ExecuteScalar(); 
+0

非常感謝!這工作完美!你能告訴我如何使用這個自動增量嗎?它似乎是一個更好的解決方案:) –

+0

您將IDENTITY屬性設置爲列,並讓數據庫在插入記錄時計算下一個數字。請記住,您不需要再爲此字段傳遞值。插入後,您可以檢索使用查詢插入的最後一個值SELECT @@ IDENTITY – Steve

+0

非常感謝您!我是一個新手到SQL :) –

0

如果您正在設置Id,並且您可能有其他用戶更好地保存新數據,並獲取保存該行的代碼從數據庫返回的I'd或全新對象。如果您嘗試跟蹤user ids其他用戶可能會添加新項目並將其弄亂。

如果你必須得到最後的數據庫,那麼你可以在你的sql中使用@inserted來獲得最後一行。

相關問題