1

バインディング ソースにバインドされたデータ グリッド コントロールを持つ単純な VS 2012 C# フォームがあります。これがバインドされている SQL Server データ ソースには、主キーでもある ID 列 (ID) があります。

この ID フィールドのデータ セット プロパティでは、AutoIncrement = true、AutoIncrement Seed = -1 (デフォルト)、AutoIncrementStep = -1 (デフォルト) を設定しています。

新しい行をデータベースに保存できません。

ツール ストリップを使用して新しいレコードを追加し、ID フィールドをクリアしてから保存アイコンをクリックすると、「IDENTITY INSERT がオフに設定されている場合、テーブル xxxx の ID 列に明示的な値を挿入できません」という例外が発生します。自動生成された値「-1」をフィールドに残すと、同じ例外が発生します。

保存ボタンに添付されたコード:

private void tblClassificationBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {         
        this.Validate();
        this.tblClassificationBindingSource.EndEdit();
        this.tableAdapterManager.UpdateAll(this.exportComplianceSISVTDataSet);
    }

最後のステップを実行すると、例外が発生します。

一部のフォーラム回答者は、回避策として IDENTITY INSERT を「ON」に設定することを推奨していますが、多くの回答者はこれに反対しています。

4

2 に答える 2

0

SQLサーバーテーブルからデータをバインドしていると思います。SQL Server エンジン自体で IDENTITY プロパティを設定します。これは、サーバーのテーブルにあります。Seed を 1 に、Increment を 1 に設定します。Identity の
詳細:ここをクリック

SQL フィドルのデモ

于 2013-03-02T16:03:31.793 に答える
0

私はまさにこの問題を抱えていました。テーブルの Identity_Insert を ON に設定してもエラーは変わらず、SQL Server Management Studio で一貫性のない動作が発生しました。ID フィールドが定義されたレコードを挿入すると、レコードは明らかに正常に挿入されましたが、select ステートメントの結果には表示されませんでした。

DataSetDesigner.cs の InitAdapter 関数で定義されている Update ステートメントと Insert ステートメントを変更して、Identity フィールドを除外することで問題を解決しました。以下に例を示します。ここで、ID は Update コマンドの ID フィールドです。

//this._adapter.UpdateCommand.CommandText = @"UPDATE [dbo].[Stopwords] SET [ID] = @ID, [Stopword] = @Stopword, [DateAdded] = @DateAdded WHERE (([ID] = @Original_ID) AND ([Stopword] = @Original_Stopword) AND ((@IsNull_DateAdded = 1 AND [DateAdded] IS NULL) OR ([DateAdded] = @Original_DateAdded))); //SELECT ID, Stopword, DateAdded FROM Stopwords WHERE (Stopword = @Stopword)"; this._adapter.UpdateCommand.CommandText = @"UPDATE [dbo].[Stopwords] SET [Stopword] = @Stopword, [DateAdded] = @DateAdded WHERE (([ID] = @Original_ID) AND ([Stopword] = @Original_Stopword) AND ((@IsNull_DateAdded = 1 AND [DateAdded] IS NULL) OR ([DateAdded] = @Original_DateAdded))); SELECT ID, Stopword, DateAdded FROM Stopwords WHERE (Stopword = @Stopword)";

これらの変更は自動生成されたコードに含まれているため、データセット コードが再生成された場合は再適用する必要があります。

于 2014-10-13T02:20:47.900 に答える