AKB48の推しメンをセンターにできちゃうかもしれない!? >>

Sub test()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb"
Set rs = New ADODB.Recordset
rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic
cn.Execute "DELETE FROM テーブル1"
rs.Update '保存
Set rs = Nothing
Set cn = Nothing
End Sub

を実行したとき
テーブル1にデータがあるときはエラーにはならないのですが
何もデータがないときは「rs.Update」でエラーになります。
なので「Update」は消して実行していますが
「Update」がなくても「Execute」を実行した後は自動的に保存されるのでしょうか?

よろしくお願いします。

A 回答 (3件)

Sub test()


Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb"
Set rs = New ADODB.Recordset
rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic
cn.Execute "DELETE FROM テーブル1"
rs.Update '保存
Set rs = Nothing
Set cn = Nothing
End Sub

Sub test()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb"
cn.Execute "DELETE FROM テーブル1"
Set cn = Nothing
End Sub
と変更しても変わりはありません。
データベースの更新を行うだけが目的であるのならば、コピーを作成する必要はありません。

一方、ユーザーの操作を非同期(操作と処理が同時でないこと)で、データベースに反映したい場合にレコードセットを使用した更新を使用します。
Sub test()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb"
Set rs = New ADODB.Recordset
rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic
'フォームロードでレコードセットを作成し、ボタン押下で削除するなど
'今回は一括削除
Do Until rs.EOF
rs.Delete
rs.MoveNext
Loop
rs.close
cn.close
Set rs = Nothing
Set cn = Nothing
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2009/05/08 19:54

補足です。


レコードセットというのは、実際のデータをプログラムのワークエリアに作成したコピーのことです。

そのため、いくらレコードセットのデータを変更使用とも、実際のデータに変更が反映されません。
それは、レコードセットがただのコピーだからです。
レコードセットを取得した状態で、コネクションをきっても問題ないはずです。

コピー(レコードセット)の更新を実データに反映させるためにUpdateメソッドが存在します。

Updateは実際にはSQL文を、つまりUPDATE文やINSERTまたはDELETE文をExecuteしています。

そのため、「Execute」を使うときは「Update」は不要?
という問いへの答えは、Updateによる自動で行われるExecuteを使用するか、自力でExecuteによりSQLを発行するかのどちらかが行われればよいので、不要ですとなります。
    • good
    • 0
この回答へのお礼

コピーだからADOをデバッグしながら実行してもアクセスでデータの編集が可能なのですね。

ひとつ確認なのですが
Executeを使用するときはレコードセットを使用してないのでしょうか?
(私が質問したコードは、rsが活用されていない?)

お礼日時:2009/05/07 21:53

これで動くと思います。



Sub test()
Dim cn As ADODB.Connection
'''Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb"
'''Set rs = New ADODB.Recordset
'''rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic
cn.Execute "DELETE FROM テーブル1"
'''rs.Update '保存
'''Set rs = Nothing
cn.close
Set cn = Nothing
End Sub
    • good
    • 0
この回答へのお礼

rsはいらないのですね!
ありがとうございます。

お礼日時:2009/05/06 19:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESS ADOでupdateが効かない

いつもありがとうございます。

現在、ADOを使ってカレントプロジェクト以外のMDBファイルのテーブルにレコードを追加する処理を行っているのですが、何のエラーメッセージも出ないままレコードが追加されません。

この場合、updateコマンドが実行された後の状態(リターンコード)を調べる事はできないでしょうか?

Aベストアンサー

前回の回答を訂正します。

<ある環境下ではエラーが起きないこともあります!>

さて、本日、Execute での UPDATE 文が実行されないという不具合に遭遇しました。
エラーもなく表面上は「実行しました!」とのメッセージ。
「ウーン!」と考えて、UPDATE 文の発行による更新を断念。
SELECT文で読み込み1レコードづつ更新するようにコードを訂正しました。
結果、この不具合は解消されました。

多分、実行したPCが某社のCAD。
「Windows、Office の更新は誤動作の原因となるのでしていない」とのこと。
こういう場合、非手続き的なコードよりも手続き的なコードの方が信頼が高いと感じました。
質問者も、シコシコと更新手続きを書いてみると解決するかもしれません。

「エラーが出ると思う!」との下りは、このような事情で撤回します。

QADO Connection.Excuteで、INSERT出来ても、DELETE,UPDATE 出来ない

ADOを使った、プログラムを練習しています。

 Dim mycon As ADODB.Connection
Dim myre As ADODB.Recordset
Set mycon = CreateObject("ADODB.Connection")
Set myre = CreateObject("ADODB.Recordset")
mycon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\sample7-10.mdb;"
mycon.Execute "INSERT INTO 社員sample VALUES(308,'will',
'営業','2007/1/1')"
※mycon.Excute "UPDATE 社員sample SET 部署名='営業'
WHERE 部署名='営業'"
※mycon.Excute "DELETE FROM 社員sample
WHERE 部署名='営業'"
mycon.Close
Set myco = Nothing

ここで、INSERTは、うまくいくのですが、UPDATE,DELETE(※)が、
うまくいきません。
(コメントを使いながら、ひとつずつ、試しています)。
アクセスしているデータベースは、Accessのサンプルmdb、
ノースウィンドです。
何か、パスワードが働いているのでしょうか。
何かわかる人がいましたら、お願いします。

ADOを使った、プログラムを練習しています。

 Dim mycon As ADODB.Connection
Dim myre As ADODB.Recordset
Set mycon = CreateObject("ADODB.Connection")
Set myre = CreateObject("ADODB.Recordset")
mycon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\sample7-10.mdb;"
mycon.Execute "INSERT INTO 社員sample VALUES(308,'will',
'営業','2007/1/1')"
※mycon.Excute "UPDATE 社員sample SET 部署名='営業'
WHERE 部署名='営業'"
※m...続きを読む

Aベストアンサー

言語の環境を教えてください。

Qカレントレコードが無い事を判定させる方法

SQLを使ってmdb内のレコードセットを取得し、
無かったらエラーを返す、という処理を作成
する場合、カレントレコードが無い事を
判定するにはどうすれば良いでしょうか?
イメージは下記のような感じです。

レコードセット as DAO.Recordset

'レコードセット取得
 Set レコードセット = db.OpenRecordset(作成したSQL文)

'判定
If カレントレコード無 Then
MsgBox "エラーメッセージ"
Exit Sub
End If

Aベストアンサー

カレントレコード無は"レコードセット.RecordCount = 0"
で行けませんか?

QSQLの速度をあげるには・・・

テキストファイルからキーワードを拾って
SQLをなげています
SQLの質問になってしまうかもしれません
いまはADO接続でやっています

Open ファイル as input......

SQL = select * from tbl where name like '%キーワード%'
execute(SQL)

レコードセットの値で処理をいろいろ・・・
Loop

もともとのDBの件数がものすごくおおくてselect文に結構な時間が
かかってしまいます。速度をあげるほうほうってあるのでしょうか
私にはおもいつかなくて・・・

こういったほうほうは どう? ってのがありましたら
おしえていただきたいのですが よろしくおねがいします。

Aベストアンサー

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

まぁ愚痴っても仕方ないか・・・


なのでぼくも(不本意ながら)Like演算子を使用しています。


長い前置きはさておき・・・

本題のSQLのスピードなのですが、
http://homepage2.nifty.com/inform/vbdb/addnew.htm
こちらに面白い記述がありました。

AddNewにかかるスピードの検証で
Access データベースの場合: AddNew のほうが INSERT INTO より5倍以上速い
SQL Server の場合: INSERT INTO のほうが AddNew より 1.4倍 くらい速い
とあります。


たぶんで物を言ってはいけないと思うけど、言っちゃいます。

(1)もしDBがアクセスで
 >レコードセットの値で処理をいろいろ・・・
 のところがUpdate用のSQL文で処理を行ってる場合

 Recordsetをして、処理を行う


(2)もしDBがアクセス以外で
 >レコードセットの値で処理をいろいろ・・・
 のところがRecordsetで処理を行ってる場合

 Recordsetをせずに、UPDATE用のSQLを実行する


未検証なのですが多分イメージとして、こういうパターンが各DBに適してるのかな?

すでにこのパターンなのであれば、意味ないですね(^^;)

参考URL:http://homepage2.nifty.com/inform/vbdb/addnew.htm

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

...続きを読む

QDAOとADOの違いについて

Accessからイントラネット上のデータベースに接続するための接続方法で困っています。
DAOとADOの違いが分からず困っています。
メリット、デメリットが分かる方、どうか教えてください。

宜しくお願い致します。

Aベストアンサー

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されているためJetデータベースエンジンの細かな機能を制御することができないといった点が不足している部分がありますがADOXやJROの各オブジェクトモデルで使用できる機能を使えばADOで不足している機能をほとんど補うことができます。
DAOはデータベースにAccessを使用するアプリケーションの場合、最大のパフォーマンスを得ることができます。しかしアプリケーションを運用していくうちに規模が大きくなってデータベースをSQLServerに移行することがあるかもしれません。
そのような可能性が含まれているのであれば最初からADOで開発しておいたほうが無難です。ADOはSQLServerに対する処理で良いパフォーマンスを得ることができます。

Jetデータベースエンジンを主なターゲットにしているならDAOで可。それ以外のデータベースを利用するのであればADOを選択する方が良いのではと思います。

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されて...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QVBとアクセスでSQL文に変数を使いたいのですが

したいことはレコードの挿入をSQL文で変数を使用して処理したいのですがうまく動作してくれません

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'(変数1)','(変数2)','(変数3)')"

変数の部分が置き換わりません、いろいろ調べてみたのですがどうもわかりませんvaluesでは変数を使えないのでしょうか?

もしそうだとするとどのようにすればレコードを挿入するSQL文で変数を利用できるのかをおしえていただけないでしょうか

Aベストアンサー

文字列なんで、&で連結すればOKです。

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'" & 変数1 & "','" & 変数2 & "','" &(変数3)& "')"

Q実行したSQLの結果を返す方法

VBでSQLを発行、及び実行をし、
MDBを更新する処理を作成しています。
各SQLの実行(SELECT、INSERT、DELETE等)が
成功or失敗したかどうかを判定するには
どのようにすれば良いのでしょうか?
ソースのイメージとしては↓のような感じです。

Dim db As DAO.Database

'DB設定
Set db = OpenDatabase(DB名)

'SQL実行
db.Execute (DB内で作成したSQL)

【実行したSQLの正常終了の判定】
【実行メッセージ(成功or失敗)出力】

Aベストアンサー

On Error GoToを使用すれば、正常・異常の判断出来ます。


正常終了した場合、戻り値(True)でリターンされます。
異常終了した場合、ErrEndラベルにジャンプしエラー内容を
イミディエイトウインドウに表示し戻り値(False)でリターンされます。

Public Function DBSEL_PROC(SQL As String) As Boolean
On Error GoTo ErrEnd 'エラー処理を設定します。
DBSEL_PROC = False '関数の戻り値として異常終了を設定します。
'実行したいSQL文を書く
DBSEL_PROC = True '関数の戻り値として正常終了を設定します。
On Error GoTo 0 'エラー処理を無効にします。
Exit Function
ErrEnd:
'異常終了した場合のエラー内容を表示します。
Debug.Print Err.Description
Exit Function
End Function

On Error GoToを使用すれば、正常・異常の判断出来ます。


正常終了した場合、戻り値(True)でリターンされます。
異常終了した場合、ErrEndラベルにジャンプしエラー内容を
イミディエイトウインドウに表示し戻り値(False)でリターンされます。

Public Function DBSEL_PROC(SQL As String) As Boolean
On Error GoTo ErrEnd 'エラー処理を設定します。
DBSEL_PROC = False '関数の戻り値として異常終了を設定します。
'実行したいSQL文を書く
DBSEL_PROC = True '関数の戻...続きを読む

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング