2013-07-17 81 views
1

我必須找到作爲標識插入列「ID_K」表KLIENT中的最後一個數字。我應該如何改進我的代碼?用於查找IDENT_CURRENT的Sql命令

非常感謝。

SqlCommand comm = new SqlCommand("IDENT_CURRENT klient", spojeni); 
      // SqlCommand comm = new SqlCommand("Select MAX (ID_K) FROM klient", spojeni); 
      spojeni.Open(); 
      int max = (int)comm.ExecuteScalar(); 
      spojeni.Close(); 


      foreach (DataGridViewRow row in dtg_ksluzby.Rows) 
      { 
       if (Convert.ToBoolean(row.Cells[3].Value) == true) 
       { 
        SqlCommand prikaz2 = new SqlCommand("INSERT INTO klisluz(text,pocet,akce,subkey) values(@val1,@val2,@val3,@val4) ", spojeni); 
        prikaz2.Parameters.AddWithValue("@val1", row.Cells["text"].Value); 
        prikaz2.Parameters.AddWithValue("@val2", row.Cells["pocet"].Value); 
        prikaz2.Parameters.AddWithValue("@val3", row.Cells["akce"].Value); 
        prikaz2.Parameters.AddWithValue("@val4", max + 1); 
        spojeni.Open(); 
        prikaz2.ExecuteNonQuery(); 
        spojeni.Close(); 
       } 
      } 
+1

'SELECT IDENT_CURRENT('tableName')'是正確的語法 –

回答

3

IDENT_CURRENT正確的語法是

SqlCommand comm = new SqlCommand("SELECT IDENT_CURRENT ('klient')", spojeni); 

記住IDENT_CURRENT被定義爲數字(38,0),所以我認爲最好的數據類型爲使用得到的返回值的ExecuteScalar是一個小數

decimal lastValue = (decimal)comm.ExecuteScalar(); 

,或者,如果你的價值觀是不是太大,你可以使用

int lastValue = Convert.ToInt32(comm.ExecuteScalar()); 

然而,像MAX(K_ID)這樣的命令也會遇到同樣的問題。如果來自不同連接的人員在此調用和插入到表'klisluz'的調用之間的表'klient'中插入新記錄,則可能會插入最後一個標識值的編號錯誤。如果'klient'和'klisluz'之間有任何關係,你應該解釋這一點,因爲從表名和列名不清楚。

+0

非常感謝,我的代碼與您的SqlCommand一起給我這個錯誤的可能性如何:指定的轉換無效。 ? – Marek

+2

是的,IDENT_CURRENT不返回一個整數,而是一個NUMERIC(38,0)。我認爲最好使用的數據類型是小數,或者如果你的值不是太大,你可以使用'int max = Convert.ToInt32(comm.ExecuteScalar()); – Steve

+1

非常感謝Steve。 – Marek