- PR -

IDENTITYなPrimaryKeyのテーブルをBindingしてレコードを追加したい

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-22 17:20
例えば、「番号(IDENTITY)・名前」項目を持つ商品マスターテーブルをDataGridView
に Binding している状態で、追加用の末尾の行の名前項目を入力するとエラーにな
ります。
番号がnullのままとのことでした。

コード:
#region DataUpdate
//**************************************************************************************************
// DataUpdate
///<summary>実際にデータベースに対して更新を行います。</summary>
///<returns>結果 [true:成功 / false:失敗]</returns>
//**************************************************************************************************
private bool DataUpdate() {
    try {
        this.Validate();
        this.商品マスターテーブルBindingSource.EndEdit();
        this.商品マスターテーブルTableAdapter.Update(this.dataSet.商品マスターテーブル); ←ここでエラー!!!
        return true;
    }
    catch (Exception ex) {
        MessageBoxes.Error(ex.Message);
        return false;
    }
}
#endregion



僕はてっきり、「番号(IDENTITY)」はレコードを追加する際に、自動的に連番を振
ってくれるために、特に何もしなくて良いと思っていたのですが。

このような場合、どのように書くのが正しい書き方なのでしょうか?
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-04-22 23:21
DataSetの該当するテーブルの番号列のAutoIncrementはtrueになってますか?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-24 15:35
Kazukiさん、いつもありがとうございます。

引用:

Kazukiさんの書き込み (2006-04-22 23:21) より:

DataSetの該当するテーブルの番号列のAutoIncrementはtrueになってますか?



いえ、なっていませんでした。
そこで、true にしてみたところエラーメッセージの内容が変わりました。
そのメッセージに従って、データベース側の商品番号項目の Is Identity を「いいえ」
にしたところ無事に動くようになりました。

これは、データベース側で連番を振るのではなく、クライアント側で連番を振るとい
うことになるのでしょうか?
複数のユーザーで操作した場合に、同じ番号が生成されることはありますか?
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-04-24 18:13
いや DBのIdentityを外す必要は無いですよ。
DBにテーブル切ってDataSetにドラッグアンドドロップして
データソースからフォームにドラッグアンドドロップするだけで
R・田中一郎さんが思ってる動きをすると思うんですが…
k_kazu
常連さん
会議室デビュー日: 2006/02/11
投稿数: 25
投稿日時: 2006-04-24 18:56
引用:

例えば、「番号(IDENTITY)・名前」項目を持つ商品マスターテーブルをDataGridView
に Binding している状態で、追加用の末尾の行の名前項目を入力するとエラーにな
ります。
番号がnullのままとのことでした。


DataGridView での動作は未検証ですが、
DataAdapter の RowUpdated イベントで @@IDENTIFY の値を DataRow に書き戻すと最後に書き込まれた IDENTITY の値が DataRow に設定できます。
これで解決できませんか?
コード:

private void ad_RowUpdated(object sender, SqlRowUpdatedEventArgs args)
{
if (args.StatementType == StatementType.Insert)
{
SqlCommand idCmd = new SqlCommand("SELECT @@IDENTITY",args.Command.Connection);
decimal newID = (decimal) idCmd.ExecuteScalar();;
args.Row["ID"] = newID;
}
}


→ 訂正です。このコードは TableAdapter ではなく DataAdapter でした。
 Kazuki さんの解説している方法が簡単で便利です。

[ メッセージ編集済み 編集者: k_kazu 編集日時 2006-04-25 10:12 ]
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-04-24 22:38
DBはもとのままいじらずに
1.DataSetのId列のAutoIncrementをTrue
2.AutoIncrementSeedを-1
3.AutoIncrementStepを-1
こうすると,一意制約違反なんかもおきないし,DBに更新に行った後には
適切なIDが自動で入っていると思います。

どうかな?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-25 06:39
スキーマもとってこないとダメ、、、って過去にあったような?
Fill と FillSchema (スペルあってる?)

番号が null のままって、変?
それって、データベース側のエラー?
(ああ、時間が)
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-25 17:33
引用:

Kazukiさんの書き込み (2006-04-24 22:38) より:

DBはもとのままいじらずに
1.DataSetのId列のAutoIncrementをTrue
2.AutoIncrementSeedを-1
3.AutoIncrementStepを-1
こうすると,一意制約違反なんかもおきないし,DBに更新に行った後には
適切なIDが自動で入っていると思います。



上記でやると問題なく動きました。
既存のやつだと、どうして駄目なのか見比べてみたいと思います。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)