1

我必须找到作为标识插入到列“ID_K”表 KLIENT 中的最后一个数字。我应该如何改进我的代码?

提前非常感谢。

  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();
                }
            }
4

1 回答 1

3

IDENT_CURRENT的正确语法是

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

请记住,IDENT_CURRENT 被定义为 NUMERIC(38,0),所以我认为用于从 ExecuteScalar 获取返回值的最佳数据类型是 Decimal

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

或者,如果您的值不是太大,您可以使用

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

然而,这个命令,就像 MAX(K_ID) 一样,也有同样的问题。如果来自不同连接的某人在此调用和对插入表 'klisluz' 的调用之间在表 'klient' 中插入一条新记录,则您可能会得到最后插入的标识值的错误编号。如果 'klient' 和 'klisluz' 之间有任何关系,你应该解释这一点,因为从表名和列名中不清楚。

于 2013-07-17T17:05:23.727 回答