- - PR -
オートナンバーの取得に関して
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-08-23 15:23
こんにちは。
今までCで制御系の仕事ばかりしていたのに、今週いきなりASP.NETでウェブアプリを作れと言われてかなり参っております。 さて。 現在勉強がてら。ACCESSを使用して簡単なWEBアプリを作っているのですが、オートナンバーの値取得で躓いています。(C#、WebMatrix使用) データをtable1に追加した後、そのtable1に含まれるオートナンバー型の値を取得し、table2の主キーとして登録することを考えています。 過去に同じような質問をされている方がいて、どうやら@@IDENTITYを使えば良さそうだというところまでは分かったのですが、下記のようにコーディングしてみたのですが、結果「0」しか帰ってこない状況です。 string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=log.mdb"; System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString); string queryString = "SELECT @@IDENTITY"; System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand(); dbCommand.CommandText = queryString; dbCommand.Connection = dbConnection; dbCommand.Connection.Open(); int a = (int)dbCommand.ExecuteScalar(); dbCommand.Connection.Close(); 原因がわからず困っております。 どうかご教授のほどお願いいたします。 | ||||
|
投稿日時: 2006-08-23 15:54
オートナンバー型のフィールドの値を読み込んで、違うテーブルの主キーのフィールドに渡す訳ですよね? ならば、オートナンバー型であることが大切なのではなくて、たまたまオートナンバー型のフィールドから普通に値を取ってくれば良いのだと思います。 | ||||
|
投稿日時: 2006-08-23 15:58
#私はASP.netもC#もサッパリ(汗
例示されたソースにテーブル名を見つけ出せないのですが、「データをtable1に追加した後、」という部分はどこにいったんでしょう? (追記) このあたり↓を参考に・・かな?(自信なし) http://www.microsoft.com/japan/msdn/net/adonet/manidcrisis.aspx [ メッセージ編集済み 編集者: shimix 編集日時 2006-08-23 16:02 ] | ||||
|
投稿日時: 2006-08-23 16:21
ご回答ありがとうございます。
書き方が悪かったみたいです。。。 table1とtable2は、DB上のテーブルのことです。 table1(オートナンバー型のcellを含む)に対してデータを書き込み、その直後にtable2に対して、table1に対して書き込んだときに生成されたオートナンバーを書き込みたいんです。table1にはオートナンバー以外でデータを一意に特定できるcellが無いので困ってしまいまして・・・んで、@@IDENTITYを発見したのですが、これがなかなかうまく行かないんです。 先の投稿のソースには、table1に書き込むところははしょってしまいました。すみません。 shimixさんの言われるサイトの他、この会議室の過去ログも見ました。 同じような質問をされている方もいて、ちょっと質問ししづらかったのですが、 自力で解決できそうになかったので投稿させていただいています。 よろしくお願いします。 | ||||
|
投稿日時: 2006-08-23 17:00
table1にInsertから@@IDENTITYの取得までの一連のソースを書かれたほうがよろしいかと。 | ||||
|
投稿日時: 2006-08-23 17:15
確かにその通りですね。失礼しました。
table1にInsertは、WebMatrixのコードウィザードが作ってくれた関数をそのまま利用しています。 int DBAddRecord( string name, string title, string date, string text, string mail, string pass, string icon, int file) { //パスを設定 string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=log.mdb"; System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString); //SQL文の設定 string queryString = "INSERT INTO [table1] ([name], [title], [date], [text], [mail], [pass], [icon], [file]) VALUES (@name, @title, @date, @text, @mail, @pass, @icon, @file)"; //コマンド情報の設定 System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand(); dbCommand.CommandText = queryString; dbCommand.Connection = dbConnection; //パラメータの設定 System.Data.IDataParameter dbParam_name = new System.Data.OleDb.OleDbParameter(); dbParam_name.ParameterName = "@name"; dbParam_name.Value = name; dbParam_name.DbType = System.Data.DbType.String; dbCommand.Parameters.Add(dbParam_name); 【中略】 int rowsAffected = 0; dbConnection.Open(); try { rowsAffected = dbCommand.ExecuteNonQuery(); } finally { dbConnection.Close(); } return rowsAffected; } この関数を呼び出したすぐ後に先に書いたコードを実行しています。 | ||||
|
投稿日時: 2006-08-23 18:07
ヘルプに
とあります。 なので、Insertと@@IDENTITYの取得は同じコネクションじゃないとマズイのでないでしょうか。 | ||||
|
投稿日時: 2006-08-23 20:44
引用:
-------------------------------------------------------------------------------- @@IDENTITY と SCOPE_IDENTITY は、現在のセッション内の任意のテーブルで生成された最後の ID 値を返します。 -------------------------------------------------------------------------------- なるほど! 「現在のセッション内」という意味をあまり深く考えていませんでした。 ど素人的な確認ですが、dbConnection.Close()をする前に@@IDENTITYを実行するという事ですね? 早速試してみます。(明日になりますが) ありがとうございました。 |