2010-06-12 32 views
9

我得到異常:「具體的強制轉換無效」,這裏是代碼具體轉換無效,在獲取SCOPE_IDENTITY

con.Open(); 
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();"; 

SqlCommand cmd = new SqlCommand(insertQuery, con); 
cmd.ExecuteNonQuery(); 
tenderId = (int)cmd.ExecuteScalar(); 
+0

你有沒有試過把它分成兩個SqlCommand對象?每個查詢一個? – luke 2010-06-12 06:50:36

+1

什麼類型是tenderId? – 2010-06-12 06:52:17

+1

你知道你正在執行sql兩次,因此你插入了兩次記錄。只需運行ExecuteScalar方法。 – 2010-06-12 07:03:31

回答

20

爲了完整起見,您的代碼示例有三個問題。

1)通過調用ExecuteNonQueryExecuteScalar來執行查詢兩次。因此,每次運行此函數時,都會在表中插入兩條記錄。你的SQL雖然是兩個不同的語句,但會一起運行,因此你只需要調用ExecuteScalar

2)Scope_Identity()returns a decimal。您可以對查詢結果使用Convert.ToInt32,也可以將返回值轉換爲小數,然後轉換爲int。

3)請務必將您的連接和命令對象包裝在using聲明中,以便它們得到妥善處置。

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    using (SqlCommand command = new SqlCommand(sql, connection)) 
    { 
     connection.Open(); 
     int tenderId = (int)(decimal)command.ExecuteScalar(); 
    } 
} 
2

測試以下第一:

object id = cmd.ExcuteScalar() 

設置一個並且看看id的類型。它可能是Decimal,不能直接轉到int

+0

這不是問題的ID列,它是'Scope_Identity()'的返回值。但是你對小數部分是正確的。 – 2010-06-12 07:08:40

1

它需要Convert.ToInt32(cmd.ExecuteScalar());

5

試試這個: -

con.Open(); 
string insertQuery = @"Insert into Tender (Name, Name1, Name2) values ('Val1','Val2','Val3');Select Scope_Identity();"; 

SqlCommand cmd = new SqlCommand(insertQuery, con); 
tenderId = Convert.ToInt32(cmd.ExecuteScalar()); 

編輯

它應該是這樣,因爲它是正確地指出,SCOPE_IDENTITY()返回一個數字(38,0): -

tenderId = Convert.ToInt32(cmd.ExecuteScalar()); 

注意:您仍然需要刪除: -

cmd.ExecuteNonQuery(); 
+4

'Scope_Identity()'返回一個小數。直接投射將不起作用,但是雙重投射會將'(int)(十進制)cmd.ExecuteScalar()'或簡單地使用'Convert.ToInt32'。 – 2010-06-12 07:07:09

+0

@anthony,是的,你是正確的,自從我使用這種類型的代碼以來,它已經很長時間了 – Rippo 2010-06-12 07:22:14