• ベストアンサー

ADO使用か構造体等の使用か

Excelでフォームを作って、そこからデータを吸い上げて保存用兼データ解析アプリケーションのデータ元となるようなCSVファイルへフォーム内容を書き込むというような、よくある操作を行うとします。 今までは、変数を宣言して配列を使ったり構造体を使ったりしていましたがデータベースを独学で学んでいるうちにVBAにもADOを使用したデータ操作が行える方法があることを最近知りました。 まだ、SQL的な書き方でものを作ったことが無いので実感が無いのですが上っ面だけ見ると細かく変数等を管理することが減るように思えるので今頼まれている内容にはADOを使用したものに挑戦してみようかと思っています。 経験者の方がいらっしゃいましたら、ADOを使用することの率直な利点と難点を聞かせてください。

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

  • ベストアンサー
noname#245936
noname#245936
回答No.1

IT屋のものです。 当方は、超DB派です。 DB操作は慣れちゃうと簡単なので、何でもかんでもDBに入れたく なり。何でもかんでも2次元データはDBやストアドプロシジャ (Accessならアクションクエリ?)でロジック処理したくなります。 DBのメリットは 1.データが大量でも問題なし。1000万件でも大丈夫。   比較的高速。 2.検索系は、テーブル間結合とソートがとても便利。   ループ文を書かなくてよい。 3.更新・削除系は、条件付けが便利。   一行のSQLで複数行に影響を与えることができる。 4.排他制御がきっちりいくため、1つのデータを複数機械で   制御するようなシステムではそもそも必須。 5.業務ロジックがSQL側に移行されるので、ソースコードの中身が   画面処理だけになってメンテナンスがしやすくなる。 6.仕様の変更がしやすくなる。   たとえば、DBが ver.1、クライアントアプリもver.1として、   DBを互換のないver.2にしたとき、同時にクライアントもver.2に   しないといけないとすると、クライアントが100台いれば同時に   いっせーのーせで100台展開しないといけない。   そこをDBがわロジックで吸収できる。 7.安全性は確実に上。 8.データと、ロジックと、画面をModel View Controlで分けられる。   なので、1つのDBをVBで見たり、i-phoneで見たりと言った   ソフトを作るとき、各ソフトは画面制御&通信実装のみでよい。 ま、SQLで何でもできちゃうので、慣れちゃえば無い生活はあり得ま せんね(笑) デメリットは…あえていうなれば。 1.DBエンジンが比較的容量的に大きい。   簡単なことをさせるにはオーバスペック。 2.足回りが重くなる。   ほかのPCに環境を持っていくとき、DBのインストールが必要。 そんな感じですね。 がんばってくださいね。

tatekenta
質問者

補足

早速のご返答ありがとうございます。 説明が足りずに誤解させてしまっているようですが、具体的なDBエンジンは考慮していません。あくまでもExcelのMicrosoft.jet.OLEDB.4.0を参照しての作業のみを考えています。 とはいえデメリットを見てみると、メリットを受けるには「DBエンジン」を使ってのことのようですが、限定的なのでしょうか?

その他の回答 (3)

noname#245936
noname#245936
回答No.4

No.1の者です。 しょうがない、概要を教えますと。 まず、SQLだろうが、Accessだろうが、やり方によってはOracle だろうが、PostgreSQLだろうが、DBMS(データベースエンジン)を 使うには何をするにも、参照するのがADOというやつです。 VBなら、Microsoft ActiveX Data Object Library ver x.x。 実態は、msadodb.dllとか、単なるファイルセットなんですけどね。 で、旧のADOライブラリでは。(.NETはちょっと違う) Connection … DBに繋ぐ、切る、アクセス権限、トランザクション RecordSet … SQLの結果データ(SELECT文の扱い) Command  … SQLのアクション (INSERT/DELETE/UPDATE)、        アクションクエリ、ストアドプロシジャ 3つ知ってたらOKなのは周知のとおり。 で。 ローカルDBをAccess使う場合も、SQL Server使う場合も 接続文字列 Connection.ConnectionStringプロパティで繋ぎ変え ます。 接続文字列は…ベタで書いてもいいけど、お客様の環境にもっていく 時などに、固定文字列だと取り扱い悪いので、僕の場合は、 Cn.ConnectionString = "FILE NAME=.\ApplicationName.udl"と書いて 拡張子「udl」というファイルを参照させます。 UDLファイルというのは、User Data Linking Fileの略で接続文字列 を覚えこませる専用のファイルです。 ためしに、テキストファイルを作成し、拡張子をUDLに変えてくだ さい。変なアイコンになりますよね。で、ダブルクリックすると… 接続定義専用のウィザードがでます。 で、保存した後で、テキストエディタで覗くと。 …ご理解いただけたかと。 あとは、大体流れが決まっていて。 (バグってたらすまね) Dim Cn as New ADODB.Connection Dim Rs as New ADODB.RecordSet Cn.ConnectionString = "File Name=XX.udl" sql = "SELECT ほにゃらら FROM テーブル WHERE どこそこ" Cn.Open If Err.Number <> 0 Then Goto Err rs.Open cn,sql,りーどおんりー,楽観ロック(書き方忘れた) if rs.count < 1 then "結果があらへんがな処理" do until eof やりたいしょり  TextBox1.Text = TextBox1.Text & fs.fields("商品名").Value & vbcrlf loop rs.close Cn.Close こんな感じ。 どこぞのWebページでサンプルコードあったと思いますので。 こんなもんでご勘弁を。

tatekenta
質問者

お礼

勉強しながら解読するのに時間がかかりまして(笑)、返事が遅くなりすみませんでした。 先回の回答の意味を履き違えていたようです。 繋ぎたいDBごとということであって、データソースというわけではないのですね? いろいろとありがとうございました。

noname#245936
noname#245936
回答No.3

No.1の者です。 う、用語に誤解ありますね。 ADOとは、Microsoft ActiveX Data Object Libraryの略で。 簡単に言うと、DBを操作するライブラリ。 プログラム部品のこと。 Microsoft.jet.OLEDB.4.0というのは、そのライブラリのなかの 実装機能の1つで、Accessのmdbファイルのデータベースを取り 扱うやり方のこと。 おなじADOでほかにも、SQL Server OLE DB、Excelなんとかなど。 接続したいDBごとに特化したADOオブジェクトライブラリがあります。 簡単に言うと、データベースを、オープン、SQLスロー、内容ゲット クローズ…などを一連操作できるConnectionだのRecordSetだの、 あのプログラムの書き方のこと、参照オブジェクトのことで。 Connectionオブジェクトの書き方を変えれば、AccessでもSQL Server でも繋げることができます。 ということですね。 (厳密には、DB毎に多少方言があるので、まったく同じソースコード  で動かすのはちょっと難しいです。SQL文の方言や、機能面の方言  があります。) なお、余談ながら。 Accessの利点は、ファイルコピペで持っていけ、手軽であること。 (本当は昔のOSではADO自身をインストールする必要があったが、  最近はOSに同梱されています) また、自身でフォームや帳票を持っていること。 Accessの欠点は、排他アクセスに弱いこと。 (複数人が同時に同一データを変更をかける時の排他制御が機能  的に弱くあいまい。たとえば全国から予約される新幹線の座席  予約システムをAccessで作ると、きっとクラッシュするか、  ダブルブッキングしてしまう。) メンテナンスをしないと容量が肥大化する。 データの断片化が起こりやすく、メンテナンスなしでは遅くなる。 ま、所詮パーソナルユースであるということであります。 なお、SQL Serverのフリー版として、SQL Server Expressという SQL Serverの簡易版がありまして。 こちらのほうがAccessより性能ははるかに上です。が。 Accessのようにごてごてした画面がないので、難易度もちょっと 上がってしまいます。 慣れないうちはAccessでいいと思いますよ。 ソフトは作ってみて、動かしてみて、動いてみて考えることが重要 ですからね。

tatekenta
質問者

補足

詳しくご教授していただきありがとうございます。 質問の内容としての回答は終わりかと思うのですが、一点気になりましたのでよろしければお付き合いください。 オブジェクトライブラリの内容については現在進行形で学習中でありますが、接続するデータソース別に特化したライブラリがあるというのは初耳です。 巷の教本では基本的にはMicrosoft ActiveX Data Object2.X Libraryを参照してからの作業についてしか書かれていません。 例えば、Excelブックやシートに特化、csvに特化となればどのライブラリにあたるのでしょうか? >Accessは排他アクセスに弱い。データの断片化。 それは当初現在の仕事を頼まれる際、把握しておりました。しかし、組織の中で個人で使用するシステムは中々考えられない。けれど、プログラミング始めたばかりの私にはSQLも同時に、ましてやオラクルにも足を出してみようかとは考えられませんでした。それもこれも一長一短とはいえ自身のスキルを考えると、ベースを何にするかはいつも悩みの種です^^; >SQL server Expressについて いいですよね、Express版。個人仕様ではないけれども、そこまでスペックは要らないという規模の開発にはうってつけだと思います。私の部署はソフトウェアにお金を出すところではないのでなおさらです(笑)しかし、触ってみるとやはりというかそこそこ私には難解でした。あと一年くらいは経験が必要な気がしています。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 #1さんのおっしゃっていることでほとんどサポートしているように思えます。 特に、マイナス面で、 >1.DBエンジンが比較的容量的に大きい。 >2.足回りが重くなる。 は、Access以外で使うときは、いくら、事前バインディングしても、重く感じます。 つまり、Excelの場合は、如実に感じます。ですから、よほどデータベースとして大きなものか、CSVファイルをデータベースファイルに換えてしまうとかしなければ、一般的なに別のワークブックにして検索してしまったほうが早いような気がします。 >1.データが大量でも問題なし。1000万件でも大丈夫。 逆にいうと、~5万件ぐらいのレベルでは、Excel単独で処理しても、楽に扱えるように思うのです。 >メリットを受けるには「DBエンジン」を使ってのことのようですが DBエンジンで、Jet を使うというなら Access という意味でしょうけれども、部分的に抜き出した機能を言うなら、メリット自体は変わらないと思います。 それと、SQL は、なれないと、どこでミスをしているのか分かりにくいです。

tatekenta
質問者

お礼

作業に踏み切るにあたってよい後押しになります。 どこをミスしているかわからないのは、当方VBでもさほど代わりませんので(笑)

関連するQ&A

  • VC++の構造体について。

    テキストファイルからのテキスト文を1行づつString^ dataに入れておいてストックしておくようなグローバル変数を作るために次のような構造体を作成しましたがエラーが出てしまいます。 このような構造体を作成して eeprom_data eeprom_data;と宣言して eeprom_data->line_test[0].data; などのようにデータにアクセスするようにしたいのですが、どのようにしたらできますでしょうか? typedef struct _line_test_ { String^ data; String^ adress; int length; }line_test; typedef struct _eeprom_data_ { array<line_test^>^ line_test = gcnew array<line_test^>(32); }eeprom_data; 現在のエラー内容はこのように表示されています。 1> HomeBank.cpp 1>c:\.....\10-03\homebank\homebank\Form1.h(763): error C2814: 'HomeBank::Form1::_line_test_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(764): error C3265: マネージ 'data' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(765): error C3265: マネージ 'adress' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(772): error C2814: 'HomeBank::Form1::_eeprom_data_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3265: マネージ 'line_test' をアンマネージ 'HomeBank::Form1::_eeprom_data_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C2864: 'HomeBank::Form1::_eeprom_data_::line_test' : static const int データ メンバー以外をクラス内で初期化することはできません ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どうぞご教授頂きますよう、よろしくお願いします。

  • ACCESS ADO Whereで取得したデータのナンバーを取得する方法

    お世話になります。 ACCESSで管理ソフトウェアを作成しているのですが、 ある配列変数 data(1 to 40)があり、 ADOでデータベースから Where句を使い、必要なデータを引き出し変数へ入れています。 引き出しているレコードの、レコードカウント数を変数に入れたいのですが、どうすればいいのでしょうか? RecordCountでは引き出したレコードの最大数をとってしまうためできませんでした。 よろしくお願いします。

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • Variant型の宣言について

    教えてください。 もし整数型とString型混在のCSVデータをsplit関数で読み込んで 配列変数に格納する場合、その変数はVariant型で宣言しなければならないのでしょうか? 因にvbscript(クラシックasp)でのプログラミングです。

  • Access/ADOを使って変数にSQL文を入れた場合の変数の内容の確認

    お知恵をかしてください。 Access2000を使用しています。 VBAのADOを使ってデータベースの操作しています。 モジュールにSQL文を入れたい時は変数を文字列で宣言して記述するのですが、 書きたいSQL文に例えば下記のような計算式を入れたい場合 『&』と『"』が 変数の宣言が文字列なのでくっついて消えてしまいますよね? 変数= sql文 と Format(Mid([FieldName],1,4) & "/" & Mid([FieldName],5,2) & "/" & Mid([FieldName],7,2),"yyyy/mm/dd") そこで、デバッグプリントをしてイミディエイトで実際いまの変数の値はどうなってるのかを確認しながら、 『"』と『&』をつけ足したりしたいのですが、 SQL文が間違っているとデバッグプリントのところに行く前に構文エラーで落ちてしまう為、確認できません。 間違いを探したいからデバッグしているのに、どうすれば良いか分かりません。 何か記述した変数内容がどうなっているのか、確認する方法はないでしょうか? うまく説明ができず、分かりづらいかもしれませんが、ご回答いただければ幸いです。

  • 変数名の使用について

    初心者です。 loadMovie();を使って外部JPGを読み込みし、 ファイル名に変数を使いたいのですが、うまくいきません。 とういか可能ですか? CSVデータより配列に格納し、配列を変数に入れてその名前でJPGにアクセスしたいです。 ↓これがうまく動いたので↓ getURL("http://www.▲▲▲.jp/"+hensu+".html"); ↓これもうまく動くと思ったら動かない・・・↓ MC.loadMovie(hensu+".jpg"); よろしくお願いします。

    • ベストアンサー
    • Flash
  • AccessVBAでADOとDAOとDoCmd

    いつもお世話になっています。access超初心者です。 いろいろまちがっているかもしれませんが、よろしくお願いします。 フォームやクエリを使うのにDoCmd、検索はSQL文、 テーブルとの接続やデータの追加はDAOですが、 Access以外のデータベースの値も必要なのでADOも使用して・・・と考えています。 たとえば、データがあるかを確認するにはフォームを開き、そこのテキストボックスに探すデータを入力、ボタンをクリックすると DoCmdで表示用フォームを用意、SQL文で検索、DAOで検索結果を表示・・・としていますが、このように一つのデータベースを作成するのに、DoCmdやDAOやADOの使用が入り乱れてもよいのでしょうか? まったく知識がなく学習本を頼りにしていますので、ツギハギだらけになってしまっているのでは?と不安です。 アドバイスのほど、よろしくおねがいいたします。

  • VB.NETにおける構造体の初期化

    お世話になります。VB2005を使用しています。 C言語では、以下のように変数宣言時に配列の初期化が 出来ますが、VB.NETではできないのでしょうか? typedef struct{  short a1;  short a2; } TEST; int main(void) {  // ここのところをVBで実現したいです  TEST stTest[] = {{0, 10}, {1, 10}};  return 0; }

  • ADO接続の共有

    ACCESS2007をフロントにしてDBをSQL-Server2005Expressにして開発を 行おうとしています。 できる限りネットワークの負荷を減らそうと、ADO接続/ADOレコードセットと フォーム連結で開発したいのですが、ネットで検索するとADO接続を各画面で 行わなければならないような記述しか見あたりません。  ・検索キーワード:ADO 接続 共有 できれば、ADO接続はプログラム起動時1回で、DBデータを表示する 画面等を開く場合は、起動時に取得した接続を使い回したいのですが、 当該方法が記載されたいるようなURL等をご教示願えないでしょうか?  ・他mdbのテーブルをリンクテーブルとして使用したいため、   AccessProject(.adp)の使用は断念しました。 上記よろしくお願いします。

  • アクセス2000VBA ADO パラメータクエリについて

    アクセス2000VBA ADO パラメータクエリについて フォーム1で得たデータをモジュールで定義した[hensu](String)に代入して、クエリ1(選択クエリ)の抽出条件として[hensu]を使用して、それによって得たデータをフォーム1で使用したいです。 フォーム1で[hensu]をパラメータクエリ?として定義するような文章(プログラム)が必要なだと思いますが、その例文(プログラム)を教えてください。 シロウト用に分かりやすくお願いします。

専門家に質問してみよう