2012-07-27 46 views
2

我有一個WinForms應用程序,其包括以下類方法處理時:無效的轉換與@@身份

public aSqlQuery(SqlCommand pSqlCom, string pMode = "object", bool pGetID = false) 
    { 
     try 
     { 
      string strConnection = aSystem.ConnectionString; 
      SqlConnection linkToDB = new SqlConnection(strConnection); 
      pSqlCom.Connection = linkToDB; 

      switch (pMode) 
      { 
       case "non query": 
        { 
         linkToDB.Open(); 
         pSqlCom.ExecuteNonQuery(); 
         if (pGetID == true) 
         { 
          SqlCommand sqlCom = new SqlCommand("SELECT @@IDENTITY;", linkToDB); 
          this.LastID = (int)sqlCom.ExecuteScalar(); 
         } 
         linkToDB.Close(); 
        } 
        break; 

加上其它開關

的pSqlCom(SqlCommand的)執行精細監守我可以看到數據寫入數據庫。然而,隨後的「SELECT @@ IDENTITY」語句給出了一個無效的轉換錯誤 我在做什麼錯誤,以及如何在我的類方法中檢索由SQL創建的新ID?

+3

什麼是「sqlCom.ExecuteScalar();」實際回報給你? – 2012-07-27 14:20:44

+2

這是很好的資源,請閱讀完整的主題,同樣到@馬丁史密斯http://stackoverflow.com/questions/1174930/int32-tryparse-or-intcommand-executescalar/1175048#1175048 – Yaroslav 2012-07-27 14:34:29

+0

@Yaroslav - 不知道爲什麼你告訴我要讀它。那裏的答案決不會否定我對你的回答所作的評論。 – 2012-07-27 14:37:05

回答

-1

正確的答案原來是,SELECT SCOPE_IDENTITY()語句不得不形成相同的SqlCommand作爲preceeded它的INSERT語句的一部分,但這是我在前面的SqlCommand'pSqlCom'中包含的。一旦SELECT SCOPE_IDENTITY()被包含爲pSqlCom的一部分,代碼就會正確返回標識。

-2

您對該命令的調用應返回不是標量類型的東西。確實,你需要使用Int32來代替。 Chek ExecuteScalar在MSDN上。

此外,我建議您使用SCOPE_IDENTITY()而不是@@Identity。詳細解釋請查看following link

+0

如果ID是一個整數,它怎麼能不是一個標量?另外我開始使用SCOPE_INDENTITY()並得到相同的錯誤信息,所以我作爲第二個選項返回了@@ IDENTITY - 但我沒有進一步的瞭解。 – PJW 2012-07-27 14:24:58

+0

在給出減號之前考慮。我可以對你的問題做同樣的事情,因爲它表示缺乏研究。但我更願意回答和幫助。再次檢查我的答案 – Yaroslav 2012-07-27 14:26:42

+0

'(Int32)cmd.ExecuteScalar();'和'(int)cmd.ExecuteScalar();'是同義詞。 – 2012-07-27 14:29:48

1

插入該行並獲得它與SCOPE_IDENTIY()給出的ID,請勿使用@@IDENTITY

您需要在相同的連接和範圍上使用SCOPE_IDENTITY(),緊接在INSERT之後。


在您的例子沒有INSERT是你的連接,所以你不能指望獲得最後生成的ID進行。

在你的榜樣其並不清楚pSqlCom執行INSERT,如果沒有任何的indentity函數將返回NULL不能轉換爲int


編輯

你想請使用SCOPE_IDENTITY(),並且您想在與INSERT相同的Command中執行此操作。

所以,你的說法應該是財產以後像

var sql = 
@"INSERT <Your Data> <Your Table>; 
SELECT SCOPE_IDENTIY();" 

using (SqlConnection connection = new SqlConnection(strConnection)) 
{ 
    using (SqlCommand command = new SqlCommand(sql, connection)) 
    { 
     connection.Open(); 
     object result = command.ExecuteScalar(); 
    } 
} 

int? id = (int?)(!Convert.IsDBNull(result) ? result : null); 
+0

Scope_Identity()給出相同的錯誤消息。請澄清範圍。我認爲,如果pSqlCom和「SELECT SCOPE_IDENTIY();」在同一個連接上背靠背執行,這會被認爲是'相同的範圍'。假設我錯了嗎? – PJW 2012-07-27 14:30:24

+0

@PJW它不清楚'pSqlCom'的作用。 – Jodrell 2012-07-27 14:33:08

+0

它是一個Sql插入命令,將一個新的條目放到數據庫表中 - 這是可行的 - 因爲每個ettempt都成功地將數據插入到數據庫中,但是我無法檢索由SQL Server創建的ID。 – PJW 2012-07-27 14:45:59