4

私は初心者のプログラマー (高校生) で、先生からsqlce、データベースに新しい行を挿入するたびに、テーブル内の主キーを自動的にインクリメントするタスクを与えられました (彼はその方法を知らないと思います)。それのいずれか:)

これが私の現在のコードです:

using (SqlCeConnection con = new SqlCeConnection(conString))
{
    con.Open();

    using (SqlCeCommand com = new SqlCeCommand("INSERT INTO Occupational VALUES(@employedBeforeBool, @nameofEmployer, @Addressemployed,@specificsAtEmployer,@employmentOnDischarge, @yearsExperienceWithEmployer, @desireToReturnToEmployer, @farmingExperienceBool, @tradesorapprentiship, @whattradesorapprentiship, @SoldierID, @Occupational_ID)", con))
    {
        com.CommandText = "SET IDENTITY_INSERT Occupational ON";
        com.Parameters.AddWithValue("@employedBeforeBool", Soldier1.employedBeforeBool);
        com.Parameters.AddWithValue("@nameofEmployer", Soldier1.nameOfEmployer);
        com.Parameters.AddWithValue("@Addressemployed", Soldier1.addressOfEmployer);
        com.Parameters.AddWithValue("@specificsAtEmployer", Soldier1.specificsAtEmployer);
        com.Parameters.AddWithValue("@employmentOnDischarge", Soldier1.employmentOnDischarge);
        com.Parameters.AddWithValue("@yearsExperienceWithEmployer", Soldier1.yearsExperienceWithEmployer);
        com.Parameters.AddWithValue("@desireToReturnToEmployer", Soldier1.desireToReturnToEmployer);
        com.Parameters.AddWithValue("@farmingExperienceBool", Soldier1.farmingExperienceBool);
        com.Parameters.AddWithValue("@tradesorapprentiship", Soldier1.tradeOrApprenticeship);
        com.Parameters.AddWithValue("@whattradesorapprentiship", Soldier1.whattradesorapprentiship);
        com.Parameters.AddWithValue("@SoldierID", SoldierID);
        //com.Parameters.AddWithValue("@Occupational_ID", counter);

        com.ExecuteNonQuery();
    }

プログラムを実行してもクラッシュせず、挿入しているように見えますが、テーブル内には何も表示されません。

4

2 に答える 2

1

現在のコードはINSERT INTOクエリをSET IDENTITYテキストで上書きします。CommandTextプロパティは1つだけです。

また、テーブルの作成時に列の自動インクリメントが行われるため、挿入中に何もする必要はありません。

デザイナを使用してテーブルを作成した場合は、戻ってIDENTITY[キー]列のプロパティをtrueに設定します。

于 2012-11-07T16:09:20.313 に答える
0

Henk が言ったように、特定の SQLCECommand に対して 2 つの異なる CommandText を持つことはできません。テーブルを作成したときにフィールド/列をIDとして識別している限り、コマンド自体の中でID列への参照をすべて取り出す必要があります(あなたのものは@Occupational_IDです)。

ただし、これまで述べられていなかった 2 つの非常に重要な事実があります。

  1. 2 つの別個の SQLCECommands が必要です (1 つは ID をオンにするため、もう 1 つは実際の挿入用です)。「using」ステートメント内に次を追加します。

    SqlCeCommand identChangeCommand = new SqlCeCommand(con); identChangeCommand.CommandText = "SET IDENTITY_INSERT Occupational ON";

  2. 挿入内に ID 列の開始値を追加する必要があります。データ型として整数を使用しているため、任意の整数値を選択して開始できます。その後のすべての挿入は、挿入された前の値に 1 を追加します。

    using (SqlCeCommand com = new SqlCeCommand("INSERT INTO Occupational VALUES(1000, @employedBeforeBool, ...

PS 両方のコマンドで必ず ExecuteNonQuery() を実行してください。それが役立つことを願っています!

于 2012-11-17T23:15:40.857 に答える