• ベストアンサー

ExcelVBAでMySQLのAUTO_INCREMETを

まず、MySQLで作ったデータベースにAUTO_INCREMETに設定したフィールドがあります。 そして、ExcelVBAのADOで新しいレコードを追加した直後にそのフィールドの値 を取得しようとしています。 レコードセット.addNew レコードセット.update レコードセット.MoveLast としても、取得できるのは更新前の値です。 開くときはadOpenDynamic, adLockOptimisticにしているのですが、 他に何か問題があるのでしょうか? ちなみに、一旦closeした後は新しい値が取得できます。

  • MySQL
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

MySQLの機能の制限事項のようですね。 別途レコードセットを準備しておき Dim rs2 As New ADODB.Recordset . . Set rs2 = cn.Execute("select last_insert_id() last_id") Debug.Print rs2!last_id (cnは共通のコネクション) の要領で挿入されたAUTO_INCREMENT指定の項目の値を取得する必要が あるようです。

meninas
質問者

お礼

お見事です。 万事解決した上に、またひとつ賢くなれました。 ありがとうございました。

関連するQ&A

  • Accessデータベースの最適化をExcelVBAでやりたい

     レコードの追加・削除を繰り返して重たくなったAccessデータベースを軽くするために、手作業で「ツール→データベースユーティリティ→最適化」とやっているのですが、これをExcelVBAで自動化したいのです。  ADOのコマンドでできるのでは?と勝手に考えているのですが、どうなんでしょうか?  ExcelVBAから可能でしたら、どのように書けばよいか教えてください。  なお、ADOの知識は非常に乏しいのですが、「ConnectionオブジェクトやRecordsetオブジェクトを定義して、レコードの追加・削除を行う」程度なら分かります。(逆に言うとそれくらいしか分かりません…)  平易な言葉でお教えいただけると助かります。よろしくお願いいたします。

  • MySQL+PHP 特定レコードの更新と作成

    MySQL+PHPの初心者です。 特定レコードの変更または新規作成のサンプルなどあればお教えいただけるでしょうか。 例えば特定商品の単価のレコードがあれば新しい単価に変更と そのレコードが無ければ新規にレコードを作成するようなケースになります。 VBAなどでは検索のSQL文からレコードセットを作成し レコードが無い場合は レコードセット名.addnewで必要なフィールドに 値をセットし レコードセット名.update 該当するレコードがあった場合は レコードセット名.edit で必要なフィールドに 値をセットし レコードセット名.updateなど簡単な処理なのですが MySQL+PHP の場合データの検索と新規レコードの単純な記述は ある程度はわかるのですが上記のようなケースは実際どのように 書かれているのかお教え願えると幸いです。 商品単価テーブルには商品コードと単価のフィールドになります。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • ADOで現在のレコードの次のレコードの値も取得

    ADOで現在のレコードの次のレコードの値も取得するには? アクセスに対してADOでデータを取得しているのですが 例えばテーブルに フィールド1 あああ いいい ううう と入ってる時に、1レコード目のあああの値を取得しているときに、同時に次のレコードのいいいの値も取得することは可能ですか? Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "SELECT * FROM テーブル1", cn, adOpenStatic, adLockPessimistic For i = 1 To rs.RecordCount MsgBox rs("フィールド1") '現在のレコード MsgBox rs("フィールド1") + 1 '次のレコード rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これだとダメなようです。 あああ いいい が表示されるようにしたいのですが、どうすればいいか教えてください。

  • MySQLの連番扱い

    アクセス2000では、オートカウントという型が存在するので、 特に意識しなくてもレコードを作成するとカウントされますが MySQLやPostgreSQLでは連番というフィールドを設けた場合、 どのように連番をつけているのでしょうか? 例えば、連番のフィールド名をserialという名前にした場合、 連番のフィールドに値をセットする前に、select max(serial)+1 from table_sample; のように連番の値を求めるのでしょうか?

    • ベストアンサー
    • MySQL
  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • DAOのExcelVBAにてAccessのデータを更新したい

    ExcelVBAよりAccessデータの追記は、AddNewを使用してできたのですが、単純な更新ができません。 strWhere = "Select * From 集計テーブル Where [フィールド1]='001'" Set dbWS = DBEngine.Workspaces(0) Set dbWB = dbWS.OpenDatabase("C:\対象MDB.mdb) 'データベースを呼び出す Set dbRes = dbWB.OpenRecordset(strWhere, dbOpenDynaset) 上記はそもそも更新ステートメントがありません。どのように書けばよいのでしょうか?どうかアドバイスお願いします。

  • VBAとSQLITEでAddNewメソッド

    こんにちは! Access VBAとSQLITEを接続して、SQLITEにデータをインサートしたいと思っています。 ADOを利用して、ADDNEWメソッドでデータを入れたいのですが、うまく動きません。 書いているコードは下記になります。 'ローカル定数 'Xはネットワークドライブ Const DRIVER_NAME As String = "Driver=SQLite3 ODBC Driver;Database=X:\test.sqlite3;" 'コネクト Set CON = New ADODB.Connection Set RS = New ADODB.Recordset CON.ConnectionString = DRIVER_NAME CON.Open 'レコードセット sql = "select * from TABLE1" table = "TABLE1" '↓問題無く通りますが、TABLE1にはデータが1件も存在しません。 RS.Open sql, CON, adOpenDynamic, adLockOptimistic '↓ここで実行エラー 3021 BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。と表示されます。 RS!F1 = "abc" '↑TABLEにはデータが一件も無い為に、このようなメッセージが表示されると思います。 '↓ODBCドライバは要求されたプロパティをサポートしていません。と表示されます。 RS.Open table, CON, adOpenDynamic, adLockOptimistic 何故、上記のようなメッセージが表示されるのでしょうか?これを解決してAddNewメソッドでデータの挿入を行いたいと思っています。 宜しくお願いします!

  • AUTO_INCREMENTについて教えてください

    ■質問1 PHPを使ってMySQLに接続しているのですが、 「AUTO_INCREMENT」指定しているIDの次の値を取得したいのですが、 どうすれば良いでしょうか? 用途としては、レコードを挿入する際、画像ファイルにレコードID名を付与したパスをつけたいのです。 <やりたいこと> 1.AUTO_INCREMENT指定しているIDの次の値を取得 2.画像ファイル名に付与 3.レコード挿入 この1を、どうやるか知りたいです ■質問2 「AUTO_INCREMENT」指定はどこに保存されているのでしょうか? 例えばレコードを削除した後、新たにデータ挿入する場合、 次の「AUTO_INCREMENT」値ではなく、削除した一番若い番号を利用することは可能でしょうか? ■質問3 質問2に関連しているのですが、DUMPデータを移行した際など、次の「AUTO_INCREMENT」値も新しいDBへ引き継がれるのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLのレコードを逆向きに並べる方法は?

    MySQLのレコードを逆向きに並べる方法は? MySQLを使って、掲示板を作ろうとしているのですが、 “db1”というデータベースに、“tbk”というテーブルを作り、 “bangou”というフィールドで、AUTO_INCREMENTで番号をふり、 下記のように、番号順にレコードをプリントしているのですが、 <?php $s=mysql_connect("localhost","root","パスワード"); mysql_select_db("db1"); $re=mysql_query("select * from tbk order by bangou"); while($kekka=mysql_fetch_array($re)){ print "<hr />"; print $kekka[0]; print "<br />"; print $kekka[1]; print "<br />"; print $kekka[2]; print "<br />"; print $kekka[3]; print "<br />"; } mysql_close($s); ?> このように、番号の若い順にレコードをプリントするのではなく、 番号(“bangou”)の古い順にレコードをプリントするようにするには、 どうすれば良いでしょうか?

  • phpからmysqlの操作について

    phpでmysqlを操作してブラウザー上へレコードの全データをテーブル化して表示したとします。 表示されているレコードから任意のレコードを選択し削除するにはどうすればよいでしょうか。 削除のsqlは解りますが、ブラウザー上に表示されているデータを選択して内容をphpへ送信する方法がわかりません。 フィールドごとにチェックボックスを出力してvalue にフィールドの値をセットしておきsubmit ボタンでvalue値を送信するような方法でしょうか。 Visual Basic などではグッリドコントロールの何処が選択されているか取得できるので簡単ですが, php とブラウザーでそんなことができるとは思えません。 よろしくお願いいたします。 php も sql もWEB上にあります。

    • ベストアンサー
    • PHP