BDEの代替は何に?


HH  2010-09-28 04:00:05  No: 39230

BDEの代替は何に?

長文になります。申し訳ございません。

今まで、データベースへの接続はBDE + SQLLink で行っていました。
BDEの開発サポートが終了したということで、BDEの代替なるものを検討中です。
BDEの代替として、ADO と ODBC しか思いつきませんでしたので
取りあえずテストプログラムを作成しようとしましたが、、
書き方が分からなかった為、いろいろ調べて次のようになりました。

そこで、、
根本的な質問で申し訳ありませんが、
BDEで接続するというのは、BDE Administrator で作成したエリアス名を
TDatabaseのAliasNameに設定するという認識で良いでしょうか?

ODBCで接続するというのは
ODBCデータソースアドミニストレータで作成したデータソースを
TDatabaseのAliasNameに設定するという認識で良いでしょうか?

BDEとODBCは、DataBase.AliasNameの設定を変更するだけで
そのまま同じ関数が利用できる?

①BDE・ODBCでのデータベース接続
function TDM.OpenDatabase(Alias, UserName, Password: string): Boolean;
begin
  Result := True;
  try
    DataBase.Connected    := False;
    DataBase.LoginPrompt  := False;
    DataBase.AliasName    := Alias; //BDE Administrator で作成したエリアス名 もしくは
                                    //ODBCデータソースアドミニストレータで作成したデータソース名
    DataBase.DatabaseName := 'DB1';
    DataBase.Params.Clear;
    DataBase.Params.Add('USER NAME=' + UserName);
    DataBase.Params.Add('PASSWORD='  + Password);
    Query.DatabaseName      := DataBase.DatabaseName;
    StoredProc.DatabaseName := DataBase.DatabaseName;
    DataBase.Connected      := True;
  except
    Result := False;
  end;
end;

また、ADOで接続するというのは UDLファイルを作成しておいて
そのUDLファイル名をConnectionStringに設定するという認識で良いでしょうか?

②ADOでのデータベース接続
function TDM.OpenDatabase: Boolean;
const
  DATA_LINK_FILE = ado.udl
var
  ConnectionStr: string;
begin
  Result := True;
  ConnectionStr := 'FILE NAME=' + ExtractFilePath(Application.ExeName) + DATA_LINK_FILE;
  ADOConnection.Connected   := False;
  ADOConnection.LoginPrompt := False;
  ADOConnection.ConnectionString := ConnectionStr;
  ADOQuery.Connection    := ADOConnection;
  ADODataSet.Connection  := ADOConnection;
  try
    ADOConnection.Connected := True;
  except
    Result := False;
  end;
end;

以上のことがあっているという前提で、テストプログラムを作成し
次の構成でパフォーマンスを比較しました。

①[ADO] + [OLE DB Provider for SQL Server] の構成
②[ODBC] + [SQL Server] の構成

同じ内容のストアドプロシージャ(読込用)をループさせてテストしましたが、
①のADOの構成の方の読込がとても遅くて使い物になりません。
②のODBCの読込だと、BDE + SQLLink には及びませんが問題無いパフォーマンスでした。

以前は、ADO > ODBC の認識でしたが、
現在は、ODBCの方が主流なのでしょうか?

また、BDEの代替は一般的に何にしたら良いでしょうか?
ご教授願います。
質問だらけで申し訳ございません。
宜しくお願いします。

<環境>
Delphi2007
Server: [Windows 2003 Server] + [SQL Server 2005]
Client: [Windows XP Professional] + [SQL Server 2005]


igy  2010-09-28 06:05:17  No: 39231

> BDEの代替は一般的に何にしたら良いでしょうか?

SQL Server 2005に接続するのでしたら、他には、

・[ADO] + [SQL Native Client] の構成
http://hiderin.air-nifty.com/delphi/2007/08/index.html#entry-20196212

・dbExpress(Ent版以上ですが・・)

など、あるようです。

# SQL Server 2005 は Express Editionしか使ったことがないので、
# 詳しくはないのですが・・・


HH  2010-09-28 11:50:59  No: 39232

igyさん、ご回答有難うございます。

>SQL Server 2005に接続するのでしたら、他には、
>
>・[ADO] + [SQL Native Client] の構成

UDLファイルのプロバイダータブに、[SQL Native Client]があったので
こちらも試してみたのですが期待できるパフォーマンスではありませんでした。
[OLE DB Provider for SQL Server]とほぼ同じです。

>・dbExpress(Ent版以上ですが・・)

こちらはよく解りません^^;;

テストプログラムでは、断然 ODBCの方がパフォーマンスも良いし、
既存プログラムの書換も殆どしなくてよさそうなので、
現段階では、ADOではなくODBCで実装しようと思っていますが、
念のため伺いたいです。今現在の主流はどちらなのでしょうか?

因みに、BDE・ODBC・ADO で接続するの質問についてもう一度書きますが、
下記の認識で合っていますか?  
この辺がきちんと理解していないと、分かっていない・間違った認識で
進めてしまうことになるので。。
宜しくお願いします。

BDEで接続するというのは、BDE Administrator で作成したエリアス名を
TDatabaseのAliasNameに設定するという認識で良いでしょうか?

ODBCで接続するというのはODBCデータソースアドミニストレータで作成したデータソースを
TDatabaseのAliasNameに設定するという認識で良いでしょうか?

ADOで接続するというのは UDLファイルを作成しておいて
そのUDLファイル名をTADOConnectionのConnectionStringに設定するという認識で良いでしょうか?


HOta  2010-09-28 14:18:25  No: 39233

BDEの中に、ネイティブ接続とODBC接続が有ります。しかしBDEは開発が止まっていて、対応DBは古いものになっています。
ADOはODBCでの接続です。


HH  2010-09-29 10:47:11  No: 39234

HOtaさん、ご回答有難うございます。

でもかなり混乱しています(^^;;

>BDEの中に、ネイティブ接続とODBC接続が有ります。
>しかしBDEは開発が止まっていて、対応DBは古いものになっています。

確かに、BDE Administratorの[環境設定]-[Drivers]に[Native]と[ODBC]がありました。
BDEは、ODBCも対応してるということですね。

確認ですが、Native接続可の対応DBの開発が止まっているということですよね?
(SQL Serverだと 最新のBDE Ver.5.2 でも SQL Server 7.0までしか対応していない)

ただODBCはその範疇ではない。ODBCは対応するODBCドライバをインストールすればよい?

>ADOはODBCでの接続です。

改めて ODBC、ADO、OLE-DB(ADOを調べたら出てきた) の意味を調べました。
ODBC … Microsoft社が提供するデータベースにアクセスするための標準API。
OLE-DB … COM技術をベースとしたODBCの拡張API。
ADO … OLE-DBをActiveXで使えるようにしたコンポーネント。

以上の関係から、結局ADOはODBCの発展形ということで
ADOはODBCでの接続です。とお答え頂いたのでしょうか?

回答頂いて申し訳ございませんが、この文だけではいまいち理解できないです。
できればもう少し詳しく教えていただけないでしょうか?

ADO接続であってもTADOConnectionやTADOQuery等を使わずに
TDatabaseやTQuery等を使って接続できるということですか?
見当違いの質問をしていると思いますが。。


HOta  2010-09-29 16:21:15  No: 39235

勘違いしていました。ADOはOLEでした。
DataBaseの対象がSQL ServerであればdbGo(ADO)が適当でしょう。
それ以外でしたら、DBX4(dbExpress)になります。
ODBCは効率が悪くなってきています。
ただ、APIですので、汎用性はあると思います。

ADOを使う場合は、コンポーネントを見ていただくと判るように、BDEは使いません。
ADO->TDataSorce->DataControls
の様な使い方になります。


HH  2010-09-29 22:15:39  No: 39236

HOtaさん、ご回答有難うございます。

>DataBaseの対象がSQL ServerであればdbGo(ADO)が適当でしょう。
>それ以外でしたら、DBX4(dbExpress)になります。
>ODBCは効率が悪くなってきています。
>ただ、APIですので、汎用性はあると思います。

やはりADOが主流なのですか。
でも遅すぎて使い物になりませんけど(^^;
設定等に問題があるのか。
クエリの見直しやINDEXの割当で改善されるレベルではないと思われます。
私の環境ではODBC(BDE経由のODBC接続?)とADOでは雲泥の差です。

dbExpressも調べてちょっとテストしてみましたが、読込時に
「不明なデータ型です: TDBXTypes.UNKNOWN パラメータの @attr_flg.」
というエラーが発生したので止めました。
データベースはSQL Server 2005 で@attr_flg の型は tinyintで属性を表すフラグです。
フラグなので1バイトのtinyintで定義しているですが、dbExpress には tinyint に相当する型が無い?
よく解りません。

>ADOを使う場合は、コンポーネントを見ていただくと判るように、BDEは使いません。
>ADO->TDataSorce->DataControls
>の様な使い方になります。

TDatabaseやTQuery等のコンポーネントはツールパレットの[BDE]に
あるということは、TDatabaseやTQueryを使用すること自体が、
結局はBDEを使用している事になる。という認識でよいですか?

できたら下記の先に書いた質問もYes,Noだけでも
構いませんので回答頂けないでしょうか?
頭の中がモヤモヤしてまして(^^;
質問ばかりの文章(語尾が?)が多くて面倒だと思いますが
宜しくお願いします。

>BDEの中に、ネイティブ接続とODBC接続が有ります。
>しかしBDEは開発が止まっていて、対応DBは古いものになっています。

確かに、BDE Administratorの[環境設定]-[Drivers]に[Native]と[ODBC]がありました。
BDEは、ODBCも対応してるということですね。
ODBCに対応しているけどこの場合はBDE経由となる。

確認ですが、Native接続可の対応DBの開発が止まっているということですよね?
(SQL Serverだと 最新のBDE Ver.5.2 でも SQL Server 7.0までしか対応していない)

ただODBCはその範疇ではない。
ODBCは対応するODBCドライバをインストールすればよい?

BDEを使わないでODBC接続にするにはADO(OLE-DB)を使う。


あいうえお  2010-09-30 03:01:50  No: 39237

>同じ内容のストアドプロシージャ(読込用)をループさせてテストしましたが、
①のADOの構成の方の読込がとても遅くて使い物になりません。

読み込み用って結果セットを返すって意味かな。
その場合なら、

ADODataSetのCacheSizeプロパティを大きな値にしても遅い?

もしくは、

CursorLocationをclUseSeverにしてサーバーカーソルにしても遅い?


HOta  2010-09-30 15:50:25  No: 39238

BDE
TDataBase->TQuery->TDataSorce->DBコンポーネント
この中に[Native(SQLLink)]と[ODBC]があります。

Interbase
TIBDataBase->TIBQuery->TDataSorce->DBコンポーネント
Interbase専用です。かなり早い。

ADO(dbGo)
TADOConnection->TADOCommand->TDataSorce->DBコンポーネント

dbExpress(DBX4)
TSQLConnection->TSQLDataSet->TDatasetProvider->TClientDataSet->TDataSorce->DBコンポーネント
複雑ですが、これが汎用では一番早いでしょう。
現在のCordGearが開発しているコンポーネントです。
DBコンポーネントを使用しないのなら、TDatasetProvider以下は要りません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加