- PR -

テーブルの最下行のデータを取得するには

1
投稿者投稿内容
雄琴
常連さん
会議室デビュー日: 2006/01/12
投稿数: 20
投稿日時: 2006-03-03 14:16
雄琴と申します。VB.net勉強中です。
質問ですが
ACCESSデータに接続してテーブルの最下行のデータを取得もしくは
指定する方法はないでしょうか。
(イメージ的にはACCESSVBAのDoCmd.GoToRecord,,aclast)

VB.netで使用しているACCESSデータのIDはオートナンバー型を使用しており、

Dim UriRow As URISET.売上表Row = URHSET.売上表.NewRow()

のようにNewRowで新しくテーブルを作成すると作成したテーブルのIDを
知る手段がわからないので質問した次第です。

よろしく回答お願いします。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-03 15:53
引用:

雄琴さんの書き込み (2006-03-03 14:16) より:

VB.netで使用しているACCESSデータのIDはオートナンバー型を使用しており、
Dim UriRow As URISET.売上表Row = URHSET.売上表.NewRow()
のようにNewRowで新しくテーブルを作成すると作成したテーブルのIDを
知る手段がわからないので質問した次第です。


うーん、知る必要になるシナリオが思いつきません。
NewRow して新しい行を追加しているのですから、
値をセットすることはあっても、値を取得するというシナリオにはならないと思うのですが...

オートナンバーならば尚のこと知る必要がないように思えます。

単に取得するのであれば、ORDER BY するだけと言えるのですが、
セットのようですので、どうしたいのかがちょっとわからない状態です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
雄琴
常連さん
会議室デビュー日: 2006/01/12
投稿数: 20
投稿日時: 2006-03-03 16:34
回答ありがとうございます。

質問に関しての追記です。
売上表(ID、氏名、住所、金額)と明細表(注文番号、商品、単価)の2つのテーブルがあります。

売上表に新しい行を追加した場合に明細表の注文番号に売上表に追加したIDを書き込みたいと考えています。イメージとして売上表のIDが1〜3ある場合に1を選択すると
明細表の注文番号の値が1のデータ(行)を抽出したい。

どうでしょうか伝わりますでしょうか。
考え方自体がナンセンスなど何かヒントがあれば教えていただきたく。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-04 22:09
テーブルを排他ロックして、
データを追加して、
ID の最大値を SELECT して、
テーブルのロックを解除する


とか。

 私は Oracle ですが、ストアドプロシージャでそういうようなことをしています。

〆 written by Jitta@わんくま同盟 on 2006/03/04
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-03-05 05:05
引用:

VB.netで使用しているACCESSデータのIDはオートナンバー型を使用しており、
Dim UriRow As URISET.売上表Row = URHSET.売上表.NewRow()
のようにNewRowで新しくテーブルを作成すると作成したテーブルのIDを
知る手段がわからないので質問した次第です。


AutoNumber型のテーブルにレコードを追加するときは
DataSet(DataTable)にレコードを追加してDataAdapterのUpdateメソッドで
データベースに反映するのは止めた方が良いのでは。

DataTable上のAutoNumber型のフィールドはあくまでも仮に採番された番号です。
AccessのTableにレコードを追加したときのAutoNumberの値と一致するという
保障はありません(複数のユーザーで共有しているとき)。

DataAdapterのUpdateメソッドを利用する代わりに
直接SQLのINSERT文で追加して直後にSELECT @@Identityを発行して
自動採番されたAutoNumberを取得します。ここで取得した、AutoNumber
を明細表の外部キーに利用します。

どうしても、DataAdapterのUpdateメソッドを使用したいときはDataTableに
格納されているAutoNumberとAccessのTableに格納されているAutoNumberを
手動で同期させる必要があります。

複数のユーザーが同時に追加すると、DataTableとAccessのTableのAutoNumberの値が
不一致になるため。
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
雄琴
常連さん
会議室デビュー日: 2006/01/12
投稿数: 20
投稿日時: 2006-03-07 10:50
思考錯誤しましたが
複数のユーザーが追加するシーンが考えられる事から
AutoNumber型を辞めて書き込みの際に都度IDを割り当てる方法を
考えてみます。
回答くださった皆様ありがとうございました。
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 2006-03-07 13:50
Osです。
方向性を決めた後で、今更ながらですが、後の参考にと思い投稿します。

非接続型のDataSet(DataTable)でAutoNumberを使って、新規レコードを追加する場合、
Accessさんが書かれている様に、DataSet(DataTable)では仮の番号として扱う必要が
あります。
私はこの仮番号を重複を避ける意味で常にマイナスでスタートし、
マイナス側に増分するように設定します。
この時、雄琴さんがされている、親子リレーションが設定されているケースでも同様で
子の該当する列に仮のマイナス番号を設定します。

この様な設定を行った場合においても、DataAdapterのUpdateメソッドを利用して
更新することは可能です。
但し、UpdateのRowUpdatedイベントを利用して、データベースが設定したAutoNumberの
値を取得し、親の仮番号を更新するロジックを実行することと、
親のINSERTを子より先に行うことで、リレーション先の子の該当列に自動的に設定されます。

UpdateのRowUpdatedイベント利用してAutoNumber取得例
1

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