- PR -

オートナンバーの取得に関して

投稿者投稿内容
うみの
常連さん
会議室デビュー日: 2006/08/23
投稿数: 20
お住まい・勤務地: 千葉・埼玉
投稿日時: 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();

原因がわからず困っております。
どうかご教授のほどお願いいたします。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-23 15:54
引用:

うみのさんの書き込み (2006-08-23 15:23) より:

データをtable1に追加した後、そのtable1に含まれるオートナンバー型の値を取得し、table2の主キーとして登録することを考えています。


オートナンバー型のフィールドの値を読み込んで、違うテーブルの主キーのフィールドに渡す訳ですよね?
ならば、オートナンバー型であることが大切なのではなくて、たまたまオートナンバー型のフィールドから普通に値を取ってくれば良いのだと思います。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 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
投稿数: 20
お住まい・勤務地: 千葉・埼玉
投稿日時: 2006-08-23 16:21
ご回答ありがとうございます。
書き方が悪かったみたいです。。。

table1とtable2は、DB上のテーブルのことです。

table1(オートナンバー型のcellを含む)に対してデータを書き込み、その直後にtable2に対して、table1に対して書き込んだときに生成されたオートナンバーを書き込みたいんです。table1にはオートナンバー以外でデータを一意に特定できるcellが無いので困ってしまいまして・・・んで、@@IDENTITYを発見したのですが、これがなかなかうまく行かないんです。
先の投稿のソースには、table1に書き込むところははしょってしまいました。すみません。

shimixさんの言われるサイトの他、この会議室の過去ログも見ました。
同じような質問をされている方もいて、ちょっと質問ししづらかったのですが、
自力で解決できそうになかったので投稿させていただいています。
よろしくお願いします。

burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-08-23 17:00
引用:

先の投稿のソースには、table1に書き込むところははしょってしまいました。すみません。



table1にInsertから@@IDENTITYの取得までの一連のソースを書かれたほうがよろしいかと。
うみの
常連さん
会議室デビュー日: 2006/08/23
投稿数: 20
お住まい・勤務地: 千葉・埼玉
投稿日時: 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;
}

この関数を呼び出したすぐ後に先に書いたコードを実行しています。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-08-23 18:07
ヘルプに
引用:

@@IDENTITY と SCOPE_IDENTITY は、現在のセッション内の任意のテーブルで生成された最後の ID 値を返します。


とあります。

なので、Insertと@@IDENTITYの取得は同じコネクションじゃないとマズイのでないでしょうか。
うみの
常連さん
会議室デビュー日: 2006/08/23
投稿数: 20
お住まい・勤務地: 千葉・埼玉
投稿日時: 2006-08-23 20:44
引用:
--------------------------------------------------------------------------------


@@IDENTITY と SCOPE_IDENTITY は、現在のセッション内の任意のテーブルで生成された最後の ID 値を返します。

--------------------------------------------------------------------------------

なるほど!
「現在のセッション内」という意味をあまり深く考えていませんでした。
ど素人的な確認ですが、dbConnection.Close()をする前に@@IDENTITYを実行するという事ですね?
早速試してみます。(明日になりますが)
ありがとうございました。

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