CSDN博客

img yuanqingfei

Delphi 访问数据库

发表于2004/6/28 16:42:00  2853人阅读

实现对SQLServer数据库的操作了。具体步骤如下:
    第一步,注册ODBC数据源。这是至关重要的一步,否则
就无法实现对数据库的访问。例如,我们定义一个可访问SQL
—Server服务器上zhb数据库的数据源ZHB。首先,选择
SQLServer类型的数据库,进入“ODBCSQLServerSetup”窗口。
然后,定义数据源名称为“ZHB”;定义Server为“SQL—Server”;
以及网络路径为“ιιSQL—Server”;最后,按option命令
按钮选择访问的数据库为zhb即可。
    第二步,配置BDE。它是Delphi专用的数据库引擎。既可
以从Delphi程序组里启动,也可以从Delphi程序项的Tools
菜单下启动。Delphi在访问SQLServer数据库时略不同于VB。
VB是直接调用ODBC来连接SQLServer的,而Delphi是首先调
用BDE中的别名,别名再通过BDE中的ODBCDriver直接访问ODBC
数据源实现的。而在BDE的ODBCDriver中你还可以定义其他
ODBC属性,例如语言驱动程序或打开模式等等。这无疑大大增
强了ODBC的功能。
    首先,在Drivers标记页中,按“NewODBCDriver”添加
新的驱动程序。在添加窗口中有三栏需要填写。第一栏
SQLLinkDriver可任取一名,如:ODBC—ZHB;第二栏
DefaultODBCDriver中选择SQLServer;在第三栏
defaultDataSourceName中选择刚才注册的数据源ZHB。按OK
确认后就增加了一个名为ODBC—ZHB的DelphiODBC驱动程序。
在其右侧的参数表中,还可以设置打开模式OPENMODE、查询模
式SQLQRYMODE、SQL语句执行模式SQLPASSTHRUMODE以及
语言驱动程序LANGDRIVER等。接下来,在Aliases标记页中,
按“NewAlias”命令按钮增加一个新的别名。在增加新别名窗
口中有两栏需要填写。第一栏为Newaliasname,可任取一个名
字,如:zhbdb;这个别名就是我们要在Table控件中直接调
用的数据库名字。第二栏Aliastype选择刚才在Drivers标记
页中定义的ODBC—ZHB,最后按OK确认,就增加了一个名为
zhbdb的别名。这样,Table控件可以通过别名zhbdb,别名zhbdb
通过Delphi的ODBCDrivers(即:ODBC—ZHB),ODBC—ZHB再
通过ODBC数据源ZHB就可连接到SQL—Server服务器上的zhb
数据库了。以上相当于完成了在BDE中的注册,接下来就可以
进行控件的属性设置了。
    第三步,设置DataAccess控件属性以实现与数据库的连
接。将Table和DataSource控件加到窗体中并修改Table控
件的属性。首先,将DatabaseName属性改为刚才在BDE别名
中定义的zhbdb。设置完databaseName属性后,就可以从
TableName属性的下拉列表中选择一个表的名字。这其间Table
控件要完成与数据库的连接,连接成功后,该列表中才会出现
可选的表名。然后,将Active属性改为true,将打开的数据
库激活,和DataSource控件建立联系。将Exclusive属性改
为true。最后,将DataSource控件的DataSet属性设为Table1。
DataSource控件为Table控件与DataControls控件相联系的
渠道。通过以上步骤的设置,DataSource1对象就与zhb数据
库的某个表建立了联系。以后,只要对DataSource1对象访问,
就可以实现对该表的操作了。
    第四步,设置DataControls控件属性以实现对数据库的
操作。一旦DataAccess类的控件被成功打开,处于窗口中的
DataControls标记页的控件就可以使用了。这些控件有
DBGrid、DBNavigator、DBText、DBEdit、DBMemo、DBImage、
DBListBox、DBComboBox、DBCheckBox以及DBRadioGroup。这
些控件只要设定他们的DataSource和DataFields属性就可以
实现对表的读写操作。
    可以看出,Delphi在设计数据库软件方面,尤其是
SQLServer数据库方面要比VB来得快;而且,其丰富的控件为
界面的设计提供了有利帮助;另外,Delphi的真编译使程序的
执行效率相当高,可移植性好。这些,都是VB所欠缺的。

 

///////////////////////////////////////////
数据库转换方法 

1.所使用的控件 

 

2.TBatchMove控件的使用 

TBatchMove允许在一组记录或是整个数据表中执行特种作业,
这个控件的主要用途在于 把数据从服务器中卸到本地的数据
源供分析或进行其他操作。TBatchMove可以在目的地建立 对
应于原数据表内容的数据表,自动将列名及数据类型进行适当
的对应操作。 

TBatchMove两个特性指明批量移动(Batch Move)操作的源表及
目的表。Source指定一个 对应于已有的源数据表的数据集(一
个Tquery或Ttable控件),Destination指明对应于一个数 据
库数据表的Ttable控件,目的数据表可以是已经存在的也可以
是不存在的。 

Mode特性指明TBatchMove对象所要做的事情: 

 

我们可以根据batCopy模式,对数据库类型进行适当的转换,以
下是从dBASE类型到其它类 型之间的转换结果: 

 

数据库转换举例 

现有用Foxbase开发的财务程序中的会计科目数据库
(kjkmk.dbf),系统将升级到Window s环境下开发,数据库将采
用Paradox语言。为了沿用该库结构和数据,可采用如下方法
进行转 换。 

1.Datasource1控件: 

AutoEdit True 

DataSet Table1 

Enabled True 

Name DataSorce1 

2.Table1控件: 

DatabaseName cw 

Name Table1 

Readonly False 

TableName KJKMK 

TableType udBase 

Datasource1控件和Table1控件共同定义被转换的源文件,该
文件是在别名为cw里的kjk mk,文件类型为Dbase。 

3.BatchMove1控件: 

Destination Table2 

Mode balCopy 

Name BatchMove1 

Sorce Table1 

MatchMovel控件定义转换类型为Copy以及源文件、目标文件。 

4.Datasource2控件: 

AutoEdit True 

DataSet Table2 

Enabled True 

Name DataSorce2 

.Table2控件: 

DatabaseName cwdb 

Name Table2 

Readonly False 

TableName KJKMK 

TableType uParadox 

Datasource2控件和Table2控件共同定义转换后的目标文件,
该文件是在别名为cwdb里的 kjkmk,文件类型为Paradox。 

6.DbGrid1控件: 

Datasorce Datasorce1 

Name DbGridl 

DbGridl网格控件先定义源文件,执行转换后再定义目标文件,
主要用于方便查看。 

7.Button1控件: 

OnClck ButtonClck 

OndragDrop 

Ondragover 

OnEnddrag 

该控件有一个OnClick事件,表示执行文件类型转换。其代码
如下: 

procedure TForm1.Button1Click(Sender:TObject); 

begin 

BatchMove1.execute; 

end; 

经上述方法定义,编译执行后,即可将kjkmk.dbf文件转换成
kjkmk.db文件,然后就可以用 Database Desktop工具对其进
行修改调整。 

用此方法还可进行其它任意文件的转换。 

////////////////////////////////////////////////////
Delphi的数据库应用通过Data Access控件与BDE连接,从而
访问数据源。Data Control s控件是些所谓Data_Aware控件,
提供用户接口。由于BDE(Borland Database Engi-neer)支 持
ODBC标准,所以可以访问多种数据源表格。 

 


使用SQL时的一些问题 

 


Delphi的数据控件基本支持标准SQL语言,但有些限制。在具
体编程时可能会遇到一些麻 烦。 

<图片>


1.Query控件的Open和ExecSQL方式的区别。Open方式可以
打开所联系的数据表格,而Ex ecSQL方式则只是运行SQL语句,
并不将运行后的表格送往相连的Data-Controls控件。因此, 如
果要用DBGrid等来显示要求的数据记录时,先用SELECT语句
筛选出符合要求的元组,再用O pen对Query控件进行操作即
可。例如有如下的应用: 


如果要在DBGridl中显示表格(表格名为WORKERS.DB),则可将
Query1的SQL属性设为:SEL ECT*FROM WORKERS,再在程序中加
入语句:Query1.Open;即可。如要插入一个记录,则Query1 的
SQL属性应为: 


INSERT INTO WORKERS(No#,Name,Sex,Age,Depart) VALUES 


(:No#,:Name,:Sex,Age,:Depart) 


在程序中则应该加入下列语句: 


Query1.Close; 


Query1.ParamByName(‘No#').asintegar:=2717; 


Query1.ParamByName(‘Name').asstring:=‘李四'; 


Query1.ParamByName(‘Sex').asstring=‘男'; 


Query1.ParamByName(‘Age').asinteger:=40; 


Query1.ParamByName(‘Depart').asstring:=‘品质管理’; 


Query1.ExecSQL; 


注意,此处如果不用ExecSQL而用Open则会出错。 


2.若要在SQL语句中使用程序中的变量,只能在SQL中先用冒
号加字段名来代替,然后在程 序中把变量的值赋给字段。上面
的例子便是这样完成的。再如,若用户输入一个工号存于Nu mber
变量中,要查询对应的记录时SQL语句应如下: 


SELECT*FROM WORKERS WHERE No#=:No# 


再在程序中加入如下语句: 


Query1.Close; 


Query1.ParamByName(‘No#').asinteger:=Number; 


Query1.Open; 

 


使用中文时的注意事项 

 


1.要在Delphi编制的数据库应用程序中使用中文,必须对BDE 
Configuration进行正确设 置,主要是对驱动语言的选择。对
Delphi 1.0而言,可在BDE Configuration Utility的Syst em
页中将LANGDRIVER设置为dBASE CHS CP936,对Delphi 2.0,
则可将System页中的LANG-DRI VER设置为Sybase SQL Dic850。
设置好后,Delphi中的数据访问控件和数据控制控件就可以 使
用中文了。值得注意的是,如果表格是在不支持中文的BDE设
置中产生的,即使在使用时BD E已经设置为支持中文也不能用
中文,此时可用DATABASE DESKTOP来修改表格的属性。将Tab le 
Property中的Table Langue改为支持中文的驱动语言即可。 


2.中文可以用作字段名,并能正确显示,但由于PASCAL语言要
求变量名为以英文字母为首 的字母数字串,所以汉字字符串不
能用作变量名。所以如果表格中有中文字段名,使用SQL时 要
十分小心,尤其是在对中文名的字段进行赋值或比较时。例如
下面几条SQL语句在使用时都 会出错: 


SELECT*FROM TEST WHERE姓名=:姓名 


INSERT INTO TEST(姓名,Age,Salary)values(:姓
名,:Age,:Salary) 

 


注意版本之间的差异 

 


Delphi 1.0和Delphi2.0在对数据库的处理上有些差别,使用
过程中要加以注意。例如D elphi 1.0的表格字段数目不能太
多,超过10个字段时将无法用INSERT语句插入记录,而Delp hi 
2.0则不存在这种限制。又如,对于有关键字的PARADOX表格进
行插入记录时,Delphi 1.0 将覆盖原有的关键字相同的记录,
而Delphi 2.0则不允许插入关键字已存在的记录,如果执行 了
这种操作,数据库的使用将会变得不正常。 
///////////////////////////////////////////


用Delphi实现将纯文本资料转入数据库 

蔡旭 
  在我们日常工作中,常会碰到这样一个难题:一大堆
收集好的纯文本格式,比较规整的资料怎样才能将它们分
离,转到自己已经建好的数据库中进行管理呢?

  例如,有一段人事档案资料archive.txt,内容如下

  小许男21工程师

  小吴女23助理工程师

  小蔡男22助理工程师

  小牟女22工程师

  要将它转入数据库archive.dbf中,archive.dbf结
构如下:

  姓名,性别,年龄,职称

  怎么办呢?现在通过使用delphi编程,很好地解决了
这个难题。Delphi提供了许多功能强大,丰富的字符处理
函数和过程,常用的有:

  (1)functionLength(S:String):Integer

  //返回串的长度

  (2)functionCopy(S:String;Index,Count:In
teger):String

  //给出一个字符串中串的拷贝

  (3)functionPos(Substr:String;S:String)
;Integer

  //查找子串在字符串中的位置

  (4)ProcedureDelete(VarS:String;Index,Cou
nt:Integer);

  //从一个字符串中去除子串

  利用Delphi提供的已有函数和过程基础上编制自己的
三个函数,实现了纯文本格式资料转入数据库功能。只要
Delphi支持的数据库都可以支持。

  archive.txt中每行数据为一个字符串,字符串中每
个被分割的数据为一个字段,分割每个字段的字符为分割
符,这里是空格,也可以是,、;、#等符号。具体思想
是:先将字符串进行调整,然后把串中每个字符同分割符
比较,将不是分割符的字符追加到MyStr串中,最后得到
一个字段的内容。通过一个循环,就可以将一个字符串分
成几个字段。

  FunctionRegulate(aString,Sepchar:string):
string

  //去掉多余的分割符,规范字符串

  FunctionGetSubStr(varsString:string;SepChar
:String):String;

  //得到字符串中一个子串

  //因要改变参数aString的值,所以将它用var定义

  FunctionGetSubStrNum(aString,SepChar:String
):Integer;

  //计算一个字符串要被分割成几个字段。

  参数:aString是所需分割的一个字符串,

  SepChar是分割符。

  FunctionRegulateStr(aString:String;Sepchar
:String):String;

  var

  i,Num:Integer;

  Flag:Boolean;

  MyStr,TempStr:String;

  begin

  Flag:ΚFalse;//进行标志,去除多余的分割符

  Num:ΚLength(aString);//计算aString串的
长度

  fori:Κ1toNumdo

  begin

  TempStr:ΚCopy(aString,i,1);//取aStrin
g串中的一字符

  ifTempStrΙΛSepCharthen

  begin

  MyStr:ΚMyStr+TempDtr;

  Flag:ΚTrue;

  end

  else

  if(FlagΚTrue)then

  begin

  Mystr:ΚMystr+TempSrt;

  Flag:ΚFalse;

  end;

  end;

  ifMyStr[Length(MyStr)]ΙΛSepCharthen

  MyStr:ΚMyStr+SepChar;

  RegulateSrt:ΚMyStr;

  end;

  FunctionGetSubStr(varaString:String,SepChar
:Strign):String;

  var

  Mysrt:String;

  StrLen:Integer;

  SepCharPso:Integer;

  begin

  StrLen:ΚLength(aString);

  SepCharPos:ΚPos(SepChar,aString);//计
算分割符在子串中的位置

  MyStr:ΚCopy(aString,1,SepCharPos-1);/
/将分割符前所有字符放到mystr串中

  Delete(aString,1,SepCharPos);//除去分割
符和分割符前的子串

  GetSubStr:ΚMyStr;//返回一个字段

  end;

  FunctionTforml.GetSubStrNum(aString:String
;SepChar:String):Integer;

  var

  i:Integer;

  StrLen:Integer;

  Num:Integer;

  begin

  StrLen:ΚLength(aString);

  Num:Κ0;

  fori:Κ1,toStrLendo

  ifCopy(aString,i,1)ΚSepCharthen

  Num:ΚNum+1;

  GetSubSrtNum:ΚNum;

  end:

  有了上面三个函数,现在介绍一下具体的应用:

  1.首先建立一个窗体Forml,加入一个RichEditl(
或Menol),一个按钮Buttonl和一个Tablel,设置Tablel
的属性:

  Tablell.DataBaseΚ′c:ιArchivs′

  Tablell.TableNameΚ′Archive.dbf′

  2.分别加入以下程序:

  ConstSpaceΚ′′

  ProcedureTForml.FormCreate(Sender:Tobject)

  begin

  RichRditl.Lines.LoadFromFile(′Archive.txt
′);

  end;

  ProcedureTForml.Button1Click(Sender:Tobje
ct);

  var

  i,j:Integer;

  MyLine:String;

  begin

  withTableldo

  begin

  Open;

  fori:Κ0toRichEditl.Lines.Count-1do

  begin

  MyLine:ΚRegulateStr(Richeditl.Lines[i],
Space);

  forj:Κ1toNumToken(MyLIne,Space)do

  begin

  Append;

  fileds[j-1].aString:ΚGetSubSrt(MyLine,
Space));

  post;

  end;

  end;

  end;

  end;

  然后就可以进行编译,运行了。此程序在win95/Del
phi2.0下调试通过。 

///////////////////////////////////////////////

正好我想问问installShield for delphi如何使
 做他个bde安装盘,和我的程序一块分发。

发信人: fuse (保险丝), 信区: Visual
标  题: Re: DELPHI能离开BDE吗?
发信站: BBS 水木清华站 (Thu Nov  6 18:02:21 1997)
 将delphi 3 的BDE目录下的文件拷贝到自己的目录下。
 如c:/my/drv
 有些可能没有用,
 一般地,以下为必须:
 IDAPI32.CFG (用BDE config 事先设好)
 IDAPI32.DLL
 BLW32.DLL   (语言驱动程序)
 IDASCI32.DLL
 IDR20009.DLL
 (语言驱动程序):
 USA.BLL
 CHARSET.BLL
 FAREAST.BLL
 (使用中文以下可以不要)
 JAPAN.BLL
 OTHER.BLL
 EUROPE.BLL
 CEEUROPE.BLL
 (以下为数据库驱动程序,根据所使用的类型选一或二)
 IDDBAS32.DLL  (DBASE)
 IDPDX32.DLL   (PARADOX)

 IDBAT32.DLL
 IDDAO32.DLL   (ACCESS)
 IDDR32.DLL
 IDODBC32.DLL  (使用了ODBC才放入)
 IDSQL32.DLL   (使用了SQL才放入)
 IDPROV32.DLL
 SQLINT32.DLL  (使用了SQL interbase才放入)
 SQLORA32.DLL
 SQLSYB32.DLL
 SQLSSC32.DLL
 SQLMSS32.DLL
 SQLDB232.DLL
 SQLINF32.DLL
 下面设置RegEdit
 /HKEY_LOCAL_MACHINE/software/borland/BLW32
 下设置
      BLAPIPATH : "c:/my/drv"
      LOCALE_LIB1 : "c:/my/drv/USA.BLL"
      LOCALE_LIB2 : "c:/my/drv/EUROPE.BLL"
      LOCALE_LIB3 : "c:/my/drv/OTHER.BLL"
      LOCALE_LIB4 : "c:/my/drv/CHARSET.BLL"
      LOCALE_LIB5 : "c:/my/drv/CEEUROPE.BLL"
      LOCALE_LIB6 : "c:/my/drv/FAREAST.BLL"
      LOCALE_LIB7 : "c:/my/drv/JAPAN.BLL"
 /HKEY_LOCAL_MACHINE/software/borland/Database Engine
 下设置
      CONFIGFILE01 : "c:/my/drv/IDAPI32.CFG"
      DLLPATH      : "c:/my/drv"
////////////////////////////////////////////////////


Delphi中数据的导出
 
整理编辑:China ASP
 

用户通常希望能在一些字处理程序中直接获取数据库中的数据。Delphi功能如此强大,当
然不会错过这些方面的应用。以下介绍三种导出方式:
一、数据导出为EXCEL和WORD文档
通过Delphi提供的OLE可以方便地访问其他提供OLE接口的应用程序,例如EXCEL、WORD等
。EXCEL中提供的完善的数据处理功能,使得数据导出到EXCEL成为一个迫切的需要。
主要的工作步骤为:
1.创建连接及工作簿。
2.读取数据库数据并写入EXCEL文档。
3.保存结果并退出EXCEL。
主要的过程示例如下:
procedure GenerateXLSFile(strFileName:string);
var
ExcelApp,MyWorkBook:Variant;
begin
try
ExcelApp:=CreateOleObject(′Excel.Application′);
MyWorkBook:=CreateOleObject(′Excel.Sheet′);
except
application.Messagebox(′无法打开Xls文件,请确认已经安装EXCEL.′,″,mb_OK+
mb_ IconStop);
Exit;
end;
MyWorkBook:=ExcelApp.workBooks.Add;
//在此处插入读数据库及写Excel文档的代码
try
MyWorkBook.saveas(strFileName);
MyWorkBook.close;
ExcelApp.Quit;
ExcelApp:=Unassigned; //释放VARIANT变量
except // 当存为一个已有的文档而又不覆盖时将
MyWorkBook.close; //产生一个例外
ExcelApp.Quit;
end;
end;
其中写Excel文档的关键语句如下:
MyWorkBook.Worksheets[1].Cells[1,1].Value:=′1234′;
相关的对象参考可以在OFFICE目录下的帮助文件VBAXLS.HLP中找到。
Delphi还提供了一个与WORD连接的例子供开发者参考,不过没有考虑到中文WORD所以“
Insert query”按键无效,只能把窗体的标题修改为“简体中文(中国)”。必须把其中判
断语种的语句从
if (Lang=′English(US)′)or(Lang=′English(UK)′ )then
修改为
if Lang< >′English(US)′ then
//不等号的右边随便写一个字符串即可
这样就可以在中文版的WORD中看到查询的结果了。
二、数据导出为TXT文档
利用Delphi中的QuickRep控件可以把打印结果输出为文本格式。示例如下:
MyQuickRep.ExportFilter:=TQRAsciiExportFilter.Create(′C:/test.txt′);
MyQuickRep.Prepare;
MyQuickRep.ExportFilter.Free;
三、数据导出为HTML文档
同样地,可以通过QuickRep控件把打印结果输出为HTML格式。示例如下:
MyQuickRep.ExportFilter:=TQRAsciiExportFilter.Create(′C:/test.htm′);
MyQuickRep.Prepare;
MyQuickRep.ExportFilter.Free;


//////////////////////////////////////////


恐怕不是吧?ADO也要数据源的说。比如OLE DB,ODBC,Jet都要配置。
如果用小的本地库,使用Paradox、Foxpro配置BDE都极为简单。特别是
使用InstallShieldExpress For Delphi 5,整个打包的过程简易非常。
如果使用的是SQL Server7,还是推荐使用ADO。不过要是用Oracle的话,
BDE肯定最好的选择。
附带说一下,前几天我做了一个小测试。在一个十二万条记录的Oracle
表中遍历取出该表的每条记录的一部份,放到一个TClientDataSet中。
使用BDE大概需要4~5秒钟。使用ADO,通过Oracle8提供的ODBC驱动和OLE
 DB Object结果差不多,都要十分钟以上,而且占足了CPU。
也许我比较愚蠢,没有找到ADO配置的有关优化参数。但是如此巨大的差
距使我相信,BDE对Oracle的接口是做了充分的优化的。

//////////////////////////////////////////////

 

在DELPHI程序中动态设置ODBC数据源 

深圳 

王发军 

---- 在DELPHI数据库应用程序中,我们访问数据库通常有两种方法.一种是通过BDE数


据库搜索引擎,即利用DELPHI自带的数据库驱动程序,这种方法的优点是速度快,但应


用范围有限,当数据库版本更新时,有可能不能用于操作新的数据库;另一种方法是通


过ODBC,这种方法的优点是可以随操作系统(如WINDOWS)提供,作为标准接口能适应多种


数据库,缺点是速度慢.在编程时,我们可以根据需要选择其中的一种方法. 

---- 在利用ODBC访问数据库时,通常的方法时是在ODBC管理面板中设置一个ODBC系统数


据源 (系统DSN),然后在DBD中或在程序中设置一个数据库别名(Alias)对应该DSN,这样


就可以如愿以偿地操作数据库了.相信用DELPHI做过数据库应用的程序员对这方面已经


很熟悉了,笔者就不多说了.在实际应用中,笔者曾遇到过这样的情况,我们的数据库


应用程序是依靠ODBC系统数据源访问和操作数据库的,应用程序运行一直良好,直到某


一天,一个对WINDOWS系统较为熟悉但又不太精通的用户不慎修改或删除了我们预先设置


的系统DSN...... 

---- 于是,笔者就开始研究怎么在程序中动态地设置ODBC系统DSN的内容,这样就可以


增加自己程序的坚固性了.经过整整一天对WINDOWS注册表的研究,终于找到了ODBC管理


程序设置DSN的秘密("天地自有公道,付出总会回报!",不是做广告!),现写出来


与大家共享,也请高手指教. 

---- ODBC管理程序设置DSN的秘密在注册表中,不信可以到HKEY_LOCAL_MACHINE/Softw


are/ODBC去看看,肯定让你感觉已经成功了一半. 

---- 首先来看看系统中已安装的ODBC数据库驱动程序.在HKEY_LOCAL_MACHINE/Softwa


re/ODBC/ ODBCInst.INI中,存放着已经安装了的ODBC数据库驱动程序的信息,从这里可


以查到已安装的ODBC数据库驱动程序对应的DLL文件等信息.在ODBCInst.INI/ODBC Dri


vers的各个键值中,键名是驱动程序名称(如Microsoft Access Driver(*.mdb)),键值


为“Installed”,表示驱动程序已安装.在 ODBCInst.INI/DriverName(DriverName为


一个驱动程序名称,如Microsoft Access Driver(*.mdb)) 中,有驱动程序的详细信息


,我们主要从这里获得ODBC驱动程序对应的DLL文件的路径和文件名,即键名Driver的键


值,一般为"C:/WINDOWS/SYSTEM/FileName.DLL". 

---- 然后来看系统DSN的注册信息,在HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI中


,存放着系统 DSN的注册信息,我们在ODBC管理面板设置的DSN参数就在这里. 

---- 下面来看看创建一个ODBC系统DSN的步骤,即我们在ODBC管理面板中完成参数设置


后,ODBC管理程序是怎么在注册表中注册DSN信息的.以创建一个名称为MyAccess的Ms 

Access97类型的系统DSN为例,我们指定的参数主要有数据库类型(Microsoft Access D


river(*.mdb))、数据源名称(MyAccess)、数据源描述(我的ACCESS)、数据库路径(C:/I


netpub/wwwroot/Test.mdb),其它参数如用户名称、用户密码、独占、只读、系统数据


库、默认目录、缓冲区大小、扫描行数、页超时等采用系统缺省参数.这时,注册系统


DSN一般应有以下几个步骤: 

---- 1.在HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/ODBC Data Sources中增加一


个字符串键值,为MyAccess = Microsoft Access Driver(*.mdb),其中分别为数据源名


称和数据库类型.这是在注册表中注册一个系统DSN名称. 

---- 2.在HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI中创建一个子键(SubKey)MyAc


cess,即创建一个键为HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/MyAccess,然后


在其下创建一些键值,详细描述一个系统DSN的配置信息,主要信息有([]中的内容为笔


者注释): 

 DBQ=C:/Inetpub/wwwroot/Test.mdb 

    [字符串,表示数据库路径] 

 Description=我的ACCESS 

   [字符串,表示数据库描述] 

 Driver=C:/PWIN98/System/odbcjt32.dll 

    [字符串,表示驱动程序,可见ODBCINST.INI] 

 DriverId=0x00000019(25) 

   [数字,表示驱动程序标识,不能改变] 

 FIL=Ms Access; 

    [字符串,可能与过滤Filter有关] 

 SafeTransaction=0x00000000 

    [数字,可能表示支持事务性操作的个数] 

 UID="" 

    [字符串,表示用户名称,此处为空字符串] 

---- 3.在HKEY_LOCAL_MACHINE/Software/ODBC/ODBC.INI/MyAccess中创建一个子键(Su


bKey)Engines, 再在其下创建子键(SubKey)Jet,即创建一个键为 HKEY_LOCAL_MACHIN


E/Software/ODBC/ODBC.INI/MyAccess/Engines/Jet,然后在其下创建一些 键值,详细


描述一个系统DSN的数据库引擎配置信息,主要信息有([]中的内容为笔者注释): 

 ImplicitCommitSync=Yes 

    [字符串,可能表示是否立即反映数据修改] 

 MaxBufferSize=0x00000200(512) 

    [数字,表示缓冲区大小] 

 PageTimeout=0x00000005(5) 

    [数字,表示页超时] 

 Threads=0x00000003(3) 

    [数字,可能表示支持的最大线程数目] 

 UserCommitSync=Yes 

    [字符串,可能表示是否立即将数据修改反映到用户] 

----   以上是建立一个系统DSN的基本信息(其它信息如选项或高级选项等信息也在这


里设置,只不过因采用默认信息,注册表里没有列出),我们在程序中按上述步骤操作注


册表,同样也能增加一个系统DSN或修改其配置.在下面的例子程序中,将按以上步骤建


立一个系统DSN,请注意程序中的注释. 

{******************************************************* 

在本程序中,将创建一个ODBC系统数据源(DSN), 

数据源名称:MyAccess 数据源描述:我的新数据源 

数据库类型:ACCESS97 

对应数据库:C:/Inetpub/wwwroot/test.mdb 

*******************************************************} 

{ 注意应在USES语句中包含Registry } 

procedure TForm1.Button1Click(Sender: TObject); 

var 

  registerTemp : TRegistry; 

  bData : array[ 0..0 ] of byte; 

begin 

  registerTemp := TRegistry.Create; 

  //建立一个Registry实例 

  with registerTemp do 

       begin 

      RootKey:=HKEY_LOCAL_MACHINE; 

      //设置根键值为HKEY_LOCAL_MACHINE 

      //找到Software/ODBC/ODBC.INI/ODBC Data Sources 

      if OpenKey('Software/ODBC/ODBC.INI 

      /ODBC Data Sources',True) then 

     begin //注册一个DSN名称 

     WriteString( 'MyAccess', 'Microsoft 

      Access Driver (*.mdb)' ); 

           end 

         else 

           begin//创建键值失败 

     memo1.lines.add('增加ODBC数据源失败'); 

     exit; 

      end; 

      CloseKey; 

//找到或创建Software/ODBC/ODBC.INI 

 /MyAccess,写入DSN配置信息 

      if OpenKey('Software/ODBC/ODBC.INI 

      /MyAccess',True) then 

     begin 

     WriteString( 'DBQ', 'C:/inetpub/wwwroot 

     /test.mdb' );//数据库目录 

     WriteString( 'Description', 

     '我的新数据源' );//数据源描述 

     WriteString( 'Driver', 'C:/PWIN98/SYSTEM/ 

     odbcjt32.dll' );//驱动程序DLL文件 

     WriteInteger( 'DriverId', 25 ); 

     //驱动程序标识 

     WriteString( 'FIL', 'Ms Access;' ); 

     //Filter依据 

     WriteInteger( 'SafeTransaction', 0 ); 

     //支持的事务操作数目 

     WriteString( 'UID', '' );//用户名称 

     bData[0] := 0; 

     WriteBinaryData( 'Exclusive', bData, 1 ); 

     //非独占方式 

     WriteBinaryData( 'ReadOnly', bData, 1 ); 

     //非只读方式 

           end 

         else//创建键值失败 

           begin 

     memo1.lines.add('增加ODBC数据源失败'); 

     exit; 

      end; 

      CloseKey; 

//找到或创建Software/ODBC/ODBC.INI 

/MyAccess/Engines/Jet 

    //写入DSN数据库引擎配置信息 

      if OpenKey('Software/ODBC/ODBC.INI 

     /MyAccess/Engines/Jet',True) then 

     begin 

     WriteString( 'ImplicitCommitSync', 'Yes' ); 

     WriteInteger( 'MaxBufferSize', 512 );//缓冲区大小 

     WriteInteger( 'PageTimeout', 10 );//页超时 

     WriteInteger( 'Threads', 3 );//支持的线程数目 

     WriteString( 'UserCommitSync', 'Yes' ); 

           end 

         else//创建键值失败 

           begin 

     memo1.lines.add('增加ODBC数据源失败'); 

     exit; 

      end; 

      CloseKey; 

         memo1.lines.add('增加新ODBC数据源成功'); 

      Free; 

       end; 

end; 

---- 以上程序在PWIN98+DELPHI3.0下调试通过. 

---- 下面是创建常见数据库类型的DSN需要设置的信息([]为注释内容,除特殊注释外,


各参数可见前面说明): 

---- 1.Access(Microsoft Access Driver(*.mdb)) 

 DBQ、Description、Driver[odbcjt32.dll]、 

    DriverID[25]、FIL[Ms Access;]、 

 SafeTransaction[默认为0]、UID[默认为空]、 

 Engines/Jet/ImplicitCommitSync[默认为Yes]、 

    Engines/Jet/MaxBufferSize[默认512]、 

 Engines/Jet/PageTimeout[默认为512]、 

    Engines/Jet/Threads[默认为3]、 

 Engines/Jet/UserCommitSync[默认为Yes] 

 可选设置:SystemDb[字符串,系统数据库的路径]、 

   ReadOnly[二进制,是否以只读方式打开,1为是,默认为0]、 

   Exclusive[二进制,是否以独占方式打开,1为是,默认为0]、 

   PWD[字符串,用户密码] 

---- 2.EXCEL(Microsoft Excel Driver(*.xls)) 

 DBQ[Excel97(=path/xxx.xls)、5.0/7.0 

    (=path/xxx.xls)、4.0(=path)、3.0(=path)]、 

 Description、Driver[odbcjt32.dll]、 

 DefaultDir[Excel97(< >DBQ)、5.0/7.0 

    (< >DBQ)、4.0(=DBQ)、3.0(=DBQ)]、 

 DriverID[790(Excel97)、22(5.0/7.0)、278(4.0)、534(3.0)]、 

 FIL[Excel5.0;]、ReadOnly、SafeTransaction、UID、 

 Engines/Excel/ImplicitCommitSync、 

    Engines/Excel/MaxScanRows[数字,扫描行数,默认为8]、 

 Engines/Excel/Threads、Engines/Excel/UserCommitSync、 

 Engines/Excel/FirstRowHasName[二进制,第一行是否是域名, 

    1表示是,默认为1] 

---- 注: Excel97和Excel7.0/5.0的DBQ对应一个XLS文件,而Excel4.0和Excel3.0则对


应一个目录;DefaultDir对应一个目录,在Excel97和Excel7.0/5.0中是DBQ所对应的路


径,而在Excel4.0和Excel3.0下则与DBQ相同;各个版本的DriverID不同. 

---- 3.dBase(Microsoft dBase Driver(*.dbf)) 

 DefaultDir[字符串,数据库文件所在目录]、 

    Description、Driver[odbcjt32.dll]、 

 DriverID[277(IV)、533(5.0)]、 

    FIL[dbase III;]、SafeTransaction、UID、 

 Engines/Xbase/ImplicitCommitSync、 

 Engines/Xbase/Collating[字符串,排序依据, 

    可为ASCII、International、Norwegian-Danish、 

  Swedish-Finnish]、 

 Engines/Xbase/Deleted[二进制,是否不显示 

    被软删除的记录,0表示显示,默认为1]、 

 Engines/Xbase/PageTimeout[默认为600]、 

    Engines/Xbase/UserCommitSync、 

 Engines/Xbase/Threads、Engines/Xbase 

    /Statistics[二进制,是否用大约的行数,1为是,默认0] 

 注:(dBaseIV和dBase5.0两个版本的DriverId有不同) 

---- 4.Foxpro(Microsoft Foxpro Driver(*.dbf)) 

 DefaultDir[数据库文件所在目录]、 

    Description、Driver[odbcjt32.dll]、 

 DriverID[536(2.6)、280(2.5)]、 

    FIL[Foxpro 2.0;]、SafeTransaction、UID、 

 Engines/Xbase/Collating[字符串, 

    排序依据,可为ASCII、International]、 

 Engines/Xbase/Deleted[二进制,是否不显示 

 

    被软删除的记录,0表示显示,默认为1]、 

 Engines/Xbase/PageTimeout[默认为600]、 

    Engines/Xbase/UserCommitSync、 

 Engines/Xbase/Threads、Engines/Xbase 

    /Statistics[二进制,是否用大约的行数,1为是,默认0] 

 注:(Foxpro2.5和Foxpro2.6两个版本的DriverId有不同) 

---- 把上面程序做成一个COM或ActiveX控件吧,在很多高级程序设计语言如DELPHI、C


++Buider、VB、VC、PB中都能用到的.

0 0

相关博文

我的热门文章

img
取 消
img