• 締切済み

MDBをADO接続でINSERT・UPDATE・DELETE

VB2005.NETの初級開発者です。 MDBをADO接続で開発を行いたいのですが 記述の方法がわかりませんので教えて下さい。 下記のようなサンプルはネット上でもよく見るのですが INSERT分で記述を行いたいのですが、サンプルが見つかりません よろしくお願いします。 後、CurrentProject.Connection.Execute strSQL, , adCmdTex このような記述をネット上で見るのですがstrSQLにInsert分を 記述すれば良いのですか、わからないので教えて下さい。 また、下記の記述の方がよいのですか? Dim ct As New Connection() Dim rt As New Recordset() ' 接続文字列を設定 ct.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\test.mdb" ' データベースに接続 ct.Open() ' テーブルを指定し、レコードセットをオープン With rt .CursorType = CursorTypeEnum.adOpenDynamic .LockType = LockTypeEnum.adLockOptimistic .Open("Insert_Tbl", ct, , , CommandTypeEnum.adCmdTable) End With ' データを追加 With rt .AddNew() .Fields("aaa").Value = TextBox1.Text .Fields("bbb").Value = TextBox2.Text .Update() End With

みんなの回答

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

>INSERT文で記述を行いたいのですが、サンプルが見つかりません とりあえず見つけたものを貼って置きます。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_s12.htm >CurrentProject.Connection.Execute strSQL, , adCmdTex これは、AccessのApplicationオブジェクトの CurrentProjectプロパティの事だと思いますので、 AccessVBAのサンプルだと思います。 これを参考にするなら、CurrentProject.Connection の部分を、 データベースに接続した Connectionオブジェクトに置き換えます。 質問のソースで言うと、 ct.Open() の後で、 strSQL = "INSERT INTO Insert_Tbl ( aaa, bbb ) values ('hoge','foo');" ct.Execute strSQL, , adCmdText + adExecuteNoRecords これでSQL文を発行できると思います。 レコードセットを返さないSQL文(INSERT, UPDATE, DELETE)の場合は、 adExecuteNoRecordsを付けた方がパフォーマンスが良なるそうです。 http://timberlandchapel.com/adooptim.html >また、下記の記述の方がよいのですか? レコードを追加すると言う意味では、どちらでも良いと思います。 どちらがパフォーマンスが良くなるか?と言う意味なら、 私には分かりません。(^^; 環境による影響もありますので、実際の実行環境で 比較テストしてみるのが確実ではないでしょうか?

masarumac
質問者

補足

ありがとうございます。 参考にさせて頂きます。

  • tomo316
  • ベストアンサー率35% (51/142)
回答No.1

これで、INSERTの記述ですよ。 このプログラムを説明すると。 1、AddNewでレコードを作ります。 2、Fieldsで値をセットします。 3、.Update()でUpdateします。 ようは、SQL的に言うとinsertで空のレコードを作りUpdateで値をセットしていると思えばわかりやすいでしょうか? こうも書けますよ。 rt.AddNew TextBox1.Text, TextBox2.Text この例はinsertのイメージです。 ただ このプログラムで気が付いたことが2、3あります。 1、セッションが切れれば自動コミットが働くのでしょうが、明示的に行ったほうがいいと思います。     rt.Close: Set rt = Nothing     ct.Close: Set ct = Nothing 2、エラー処理がありませんね AddNewのときと、Updateの時にエラーが起こるかもしれません。

masarumac
質問者

補足

ありがとうございます。 これで、INSERTの記述ですよ。 →たしかにINSERTの記述だとはわかるんですが なるべく汎用的に作成したかったもので、 いろいろ調べていたのです。 後、エラー処理がありませんの指摘どおり 記述していないのですが、記述のしかたが よくわかりませんので教えて頂けますでしょうか。 よろしくお願いします。

関連するQ&A

  • ADO 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】mdbのレコードの条件検索

    日付+特定のレコードの値が優のレコードをExcelのセルに表示するマクロを組んでいます。 Option Explicit Const cnsADO_CONNECT1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" Dim dbCon As New ADODB.Connection Dim dbRes As New ADODB.Recordset Dim dbCols As ADODB.Fields Dim strStartData As String, strEndData As String Dim strsql As String Dim Gyo As Long Public Sub testテスト() 'テスト用 strStartData = 20120401 strEndData = 20130331 '接続mdb名 FileName = \\~~テスト.mdb dbCon.Open cnsADO_CONNECT1 & FileName strsql = "SELECT * FROM テーブル名 WHERE 日付 BETWEEN '" & strStartData & "' AND '" & strEndData & "' ORDER BY 日付"   dbRes.Open strsql, dbCon, adOpenKeyset, adLockReadOnly strsql = Replace(strsql, "strEndData", strEndData) strsql = Replace(strsql, "strStartData", strStartData) dbRes.Filter = "座学判定  = '優' or WHERE 実技判定  = '優' "   dbRes.Open strsql, dbCon, adOpenKeyset, adLockReadOnly ←ここでエラー Gyo = 1 Rows("2:65536").ClearContents dbRes.MoveFirst Do Until dbRes.EOF ' 行の変数を加算し必要項目を選択してセルにセット Gyo = Gyo + 1 Set dbCols = dbRes.Fields 'DT_P_点検Tblテーブルよりを抜き出す Cells(Gyo, 1).Value = dbCols("ID").Value Cells(Gyo, 2).Value = dbCols("日付").Value Cells(Gyo, 3).Value = dbCols("座学判定").Value Cells(Gyo, 4).Value = dbCols("実技判定").Value ' 次のレコードに移る dbRes.MoveNext Loop ' レコードセット、データベースを閉じる dbRes.Close Set dbRes = Nothing dbCon.Close Set dbCon = Nothing End Sub dbRes.Open strsql, dbCon, adOpenKeyset, adLockReadOnly の部分でエラーになってしまいます。 「CommandオブジェクトのCommandTextが設定されていません」と表示されます。 dbRes.Filter = "座学判定  = '優' or WHERE 実技判定  = '優' "   ここの部分が無ければ、指定の期間のデータを抽出してくれています。 指定期間 + 特定の部分がTrueの場合の抜き出しをしたいのですが、どこかで指定が不足しているのでしょうか?

  • アクセスVBA。ADO

    CSVから列を分割してテーブルにしたいかったので 下記のコードを記述しましたが、 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim datacount As Long Set cn = New ADODB.Connection With cn .ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\;" .Properties("Extended Properties").Value = "text;HDR=YES;" .Open End With Set rs = cn.Execute("SELECT * FROM 構成マスタ.csv") datacount = rs.Fields.Count For i = 0 To datacount strsql = "SELECT " & rs.Fields(i).Name & " INTO " & rs.Fields(i).Name & " FROM 構成マスタ.csv;" cn.Execute strsql Next i rs.Close cn.Close Set rs = Nothing Set cn = Nothing SQLを実行するところで、「日付エラー」となってしまいます。 データには特に日付等はないのでエラーになる原因がわかりません。 どなたかご教示いただけますでしょうか。

  • ACCESS97で作成したmdbファイルに書き込む為の記述

     ADOを使用してExcelで作成したデータをACCESS97で作成したmdbファイルに書き込む処理を行いたいと思います。 書籍を見ながらコードを記述しているのですが、1,2,の項目については問題なく処理ができるのですが、最後のmdbファイルへの書き込み処理がどうしてもうまくいきません。 主に出力されるエラーは「現在のプロバイダはIndex機能に必要なインターフェイスをサポートしていません。」というものです。いろいろ試行錯誤したのですが解決できませんでした。 やはりACCESS97で作成したmdbファイルだからダメなのでしょうか? 原因と対処方法を教えていただければ幸いです。よろしくお願いします。以下はmdbファイルへの書き込みのサンプルコードです。 Dim myFile As String Dim myTbl As String Dim myRng As Range Dim myCon As New ADODB.Connection Dim myRS As New ADODB.Recordset Dim i As Integer myFile = ThisWorkbook.Path & "\sampleDB.mdb" myTbl = "社員" Set myRng = ThisWorkbook.Worksheets(1).Range("A1").CurrentRegion With myCon .Provider = "Microsoft.Jet.OLEDB.4.0" 'Access(Jet)用のOLE DBプロバイダを使用 .Open myFile End With myRS.Open myTbl, myCon, adOpenStatic, adLockPessimistic, adCmdTableDirect myRS.Index = "社員ID" For i = 2 To myRng.Rows.Count myRS.Seek myRng(i, 1).Value If myRS.EOF Then myRS.AddNew For j = 1 To myRng.Columns.Count myRS.Fields(myRng(1, j).Value).Value = myRng(i, j).Value Next Next myRS.Update myRS.Close Set myRS = Nothing myCon.Close Set myCon = Nothing

  • ADO.NETのDataSetのコピー

    ADO.NETでsdfファイルからmdbファイルへテーブル(TBL1)を移行させたいと思っています。 以下のようなコードでDataSetをコピーできないか試しましたが、移行できません。 sdf、mdbともテーブルのカラムの構造は同一です。 mdbの方にはレコードが空のテーブルが用意してあります。 何が間違っているのでしょうか?お教えいただけると助かります。 SDF Dim con As SqlCeConnection = DBUtility.GetConnection() con.Open() Dim strSQL As String strSQL = "select * from TBL1" Dim adapter As SqlCeDataAdapter = _ New SqlCeDataAdapter(New SqlCeCommand(strSQL, con)) con.Close() Dim ds1 As DataSet = New DataSet() adapter.Fill(ds1, "TBL1") Dim con2 As OleDbConnection = DBUtility.GetOLEConnection() con2.Open() 'MDB Dim strSQL2 As String strSQL2 = "select * from TBL1" Dim adapter2 As OleDbDataAdapter = _ New OleDbDataAdapter(New OleDbCommand(strSQL2, con2)) Dim ds2 As DataSet = New DataSet() ds2 = ds1.Copy Dim cb As OleDbCommandBuilder = New OleDbCommandBuilder(adapter2) adapter2.Update(ds2, "TBL1")

  • Excel VBA ADOでのCSV取込みについて

    下記は、Excel VBAでADOを使って、CSVデータを取り出すソースです。ソースは、とあるサイトからほぼ丸写しです。 Sub main()   Const DRIVER As String = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ="   Const PROVIDER As String = "Provider=MSDASQL;Extended Properties="""   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Dim idx As Integer   Dim strSQL As String   cn.ConnectionString = PROVIDER & DRIVER & "C:\"""   cn.Open   '全件数取得   strSQL = "SELECT * FROM Sample.csv"   'CSVファイルの内容を取得   Set rs = cn.Execute(strSQL)   rs.MoveFirst   Do Until rs.EOF     For idx = 0 To rs.Fields.Count - 1       Debug.Print rs.Fields(idx).Value '←ここ     Next idx     rs.MoveNext   Loop   Set rs = Nothing   cn.Close   Set cn = Nothing End Sub ここで、「'←ここ」と示した行のrs.Fields(idx).Valueって、実際には「001」と書かれた値は、ダブルクォーテーションでも入ってない限りは「1」と変換されちゃいますよね?これをちゃんと、実際の値「001」のまま取得することって出来ないのでしょうか?

  • 【EXCEL VBA】ローカルmdbからデータを取得したい

    (環境)  WindowsXP  Excel2003  Access2003 現在、SQLサーバーからデータを取得しています。 下記のソースです(一部抜粋) Private Const SRC_SQL = "Provider=SQLOLEDB.1;User ID=testid;Password=testpass;Data Source=TEST-DB-1;Initial Catalog=testDB" Private Const TBL_TEST = "TEST.テストテーブル" Public Sub TEST_PRO Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CreateObject("ADODB.Connection") cn.CommandTimeout = 0 cn.Open SRC_SQL strSQL = "SELECT X.*, FROM " & TBL_TEST & " X" strSQL = strSQL & " WHERE X.担当者CD = '" & wNAME & "'" strSQL = strSQL & " AND X.オープン日 >= '" & start_dt & "'" strSQL = strSQL & " AND X.オープン日 < '" & end_dt & "'" strSQL = strSQL & " ORDER BY X.オープン日 ASC" Set rs = CreateObject("ADODB.Recordset") rs.Open strSQL, cn With rs ~~~ End With Set rs = Nothing End Sub これを、SQLサーバーではなく、 C:\TESTACCESS.mdbのテーブル:テストテーブル からデータを取得するように変更したいのですが、 どのようにコーディングすればよろしいでしょうか? よろしくお願いします。

  • ADO&mdbで、リンクテーブルの作り方

    お世話になっています。 行き詰って困っています。 あるmdb(Access2000形式)内のテーブルを別のmdb(同)から見られるようリンクテーブルを作りたいのですができません。 VB.NET 2005 でやっています。 いろいろ調べてMSDN等からサンプルを引っ張り、以下のように作っても、 Dim catDB As ADOX.Catalog = New ADOX.Catalog Dim tblLink As ADOX.Table = New ADOX.Table catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Mdb_Link With tblLink .Name = "TEST_TBL" .ParentCatalog = catDB .Properties("Jet OLEDB:Create Link") = True <---ここと .Properties("Jet OLEDB:Link Provider String") = Mdb_Test <---ここと .Properties("Jet OLEDB:Remote Table Name") = "TEST_TBL" <---ここ End With catDB.Tables.Append(tblLink) catDB = Nothing .Propertiesの3行でエラー(プロパティ'Item'は'ReadOnly'です。)になってしまい、サンプル通りに行きません。 これについて何か心当たりありましたら教えてくださると嬉しいです。

  • ADOを使いDBへ読み書きしたい

    VB初心者です。よろしくお願いします。 今、VBのActiveXドキュメントを使い、ブラウザ上で利用できるシステムを作ろうと思っています。その際、Textboxに入力されたデータをADOを使いAccess2003に格納したいのですが、うまくいきません。DAOではうまくいきました。 コードは以下の通りです。 Private Sub Command1_Click() Dim db As ADODB.Connection Dim rst1 As ADODB.Recordset Set db = New ADODB.Connection db.ConnectionString= "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source = 'データへのパス'\zaseki3.mdb" db.Open MsgBox ("接続成功") Set rst1 = New ADODB.Recordset ☆☆rst1.Open "T-利用者", db,adOpenForwardOnly,adLockOptimistic   With rst1 .AddNew .Fields("氏名") = Text1 .Update End With rst1.Close db.Close Set db = Nothing Set rst1 = Nothing End Sub ☆☆のところでエラーが発生します。エラー内容は次の通りです。  実行時エラー'-2147217900(80040e14)': SQLステートメントが正しくありません。'DELETE'などを使用してく ださい。 環境は Windows XP, VB6.0, Access2003  です。 よろしくお願いします。

  • <VB.NET>INSERT文でDBにデータを入れたい 

    プログラム初心者です。 ボタンを押したらtextboxの値がDBのテーブルに格納されて画面が閉じるという処理をしたいです。 そして他の画面でボタンを押すとINSERT済みのテーブルが出るという 処理をしようと思っています。 今のところは、他の画面でボタンを押してもINSERT済みのテーブルが でないという状態です。元のテーブルのデータはでます。 サンプルを見つけてやってみたのですが、思った結果がでません。 public sub botton1-click dim sql_insert as string dim cmd_insert as oledbcommand dim strconn as string = "provider = ~OLEDB4.0 = ~.mdb" DA = New oledbDataAdapter conn = New oledbconnection(strconn) sql_insert = "INSERT INTO A組(名前) VALUES(TextBox1.Text) cmd_insert = New oledbcommand(sql_insert,conn) DA.insertCommand = cmd_insert Me.colse end sub DataAdapterはdatasetを使わず直接DBに格納させるINSERTの時にでも 使うのでしょうか? 自分自身まだよく分かっていないので、正しいコードと処理の流れを 教えて欲しいです。 使っているのはaccess2000、VB.NET2003です。よろしくお願いします。

専門家に質問してみよう