1

ID として列「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' に新しいレコードを挿入すると、最後に挿入された ID 値に対して間違った番号を取得する可能性があります。「klient」と「klisluz」の間になんらかの関係がある場合は、テーブル名と列名からして明確ではないため、これを説明する必要があります。

于 2013-07-17T17:05:23.727 に答える