大家给点意见,以前我一直用PB做数据库,别的一直用Delphi开发,但是我现在完全想Delphi做,才发现Delphi的数据表现风格太差了。而且在写SQL语句时要在控件里写,也可能我不熟悉这方面,在事物对象处理也不是非常明确、还有计算列。
希望大家给点意见怎样做才能避免这些缺点,或者给我提一点有关Delphi开发数据库的经验。
谢谢大家。

解决方案 »

  1.   

    其实delphi的功能很强大,并且特别灵活,我就不喜欢PB
      

  2.   

    哈哈,我和你相反,我以前一直用DELPHI,现在用PB,哈哈,
      

  3.   

    不会呀,Sql语句要在控件里写呀,你可以通过Delphi调用存储函数呀,简单的语句可以通过SQL.Add添加,计算列你写在OnCalcute事件里就可以了实现了呀,
    Delphi支持MTS事物服务器,对事物对象处理也不错嘛
    这里是Delphi论坛,不许说Delphi不好,要不打扁你,嘻嘻!
      

  4.   

    在delphi里没有嵌入式sql,可能不太方便
    delphi对事务处理提供了全面的支持,可以数据库的事务方法和批更新取得和pb中同样的效果
      

  5.   

    难道说把所有大型的SQL语句都写入存储过程吗?如果语句少、用户少的情况当然没有为题了。但是当语句多用户多的时候可就不好办了吧。是不是又有写中间层了。
      

  6.   

    深有同感. 
    也许delphi数据库太灵活了吧,所以不好控制而且觉得特别扭.
      

  7.   

    delphi哪里是必须写在控件里了,它也可以想其他软件一样,
    手工写出来的。
      

  8.   

    Delphi下的ADO本文向您揭示在Delphi中使用ADO是如何轻而易举,结合了ADO的Delphi应用程序,将不再依赖于BDE。ADO的精髓在于利用简单的COM指令来快速方便的访问ODBC数据源,微软的表格、列表框等ActiveX控件使得用户可以简便的利用ADO工作;然而,本文中笔者仅仅向您展示了如何利用程序访问数据库,将不采用任何可视化数据控件。本文将向您展示如何利用Variant或interfaces访问和修改ADO数据库,示例程序非常简单,可运行于Delphi 3或4。安装和访问一个ADO数据库。示例程序的代码不足150行,然而运行本程序必须首先安装ADO以及设置ODBC数据源。ADO是一组COM组件的集合,允许程序员利用利用少量的简单代码访问数据库。ADO通常和OLEDB、Universal Data Access以及Microsoft Data Access Components(MDAC)联系在一起。OLEDB产生较ADO为早,是后期各种技术的基础。如果你已经安装了ADO,你会在你的计算机中发现ADODB.DLL或者是MSADO15.DLL,这些文件中包含了一个类库,其中包括了利用ADO编程所需的全部接口和常量。在Delphi中,选择菜单Project | Import Type Library,选择以上的DLL文件,然后确定,系统生成了一个基于ADODB.DLL的ADODB_TLB.Pas文件,这个文件中包含了所有Delphi ADO编程所需的声明。最后一步的准备工作就是将Delphi演示数据库中的Clients.DBF设置为ODBC系统DSN,其别名为DBDemosDBase,驱动程序为Dbase 5。以下程序清单同时利用Variants和Interfaces访问ADO:unit Main;{---------------------------------------------------------------------Created Jan 51999. Copyright (c) 1999 by Charlie Calvert----------------------------------------------------------------------}interfaceuses WindowsMessagesSysUtilsClassesGraphicsControls
    FormsDialogsStdCtrlsComObjGridsADODB_TLBExtCtrls;constSELECTSTRING = 'SELECT * FROM Clients.dbf';DSNSTRING = 'DBDemosDBase';type TForm1 = class(TForm)StringGrid1: TStringGrid;Panel1: TPanel;VariantBtn: TButton;InterfaceBtn: TButton;UpdateBtn: TButton;Edit1: TEdit;procedure VariantBtnClick(Sender: TObject);procedure InterfaceBtnClick(Sender: TObject);procedure UpdateBtnClick(Sender: TObject);procedure StringGrid1SelectCell(Sender: TObject; AColARow: Integer;var CanSelect: Boolean);
    privateprocedure Display(RecordSet: _RecordSet); { Private declarations }public { Public declarations }end;var Form1: TForm1;implementationusesActiveX;{$R *.DFM}procedure TForm1.Display(RecordSet: _RecordSet);varYi: Integer;beginY := 1;repeatfor i := 0 to 6 doStringGrid1.Cells[iY] := RecordSet.Fields[i].Value;RecordSet.Move(1EmptyParam);Inc(Y);until RecordSet.EOF;end;procedure TForm1.InterfaceBtnClick(Sender: TObject);var RecordSet: _RecordSet;DSN: string;begin// 生成空的recordset objectOleCheck(CoCreateInstance(CLASS_RecordSetnil
    CLSCTX_ALLIID__RecordSetRecordSet));DSN := 'dsn=' + DSNSTRING;// 填写数据RecordSet.Open(SelectStringDSNadOpenForwardOnly
    adLockReadOnlyadCmdUnspecified);// 显示数据Display(RecordSet);UpdateBtn.Enabled := True;end;procedure TForm1.UpdateBtnClick(Sender: TObject);var RecordSet: _RecordSet;DSN: string;beginOleCheck(CoCreateInstance(CLASS_RecordSetnil
    CLSCTX_ALLIID__RecordSetRecordSet));DSN := 'dsn=' + DSNSTRING;// Fill the recordsetRecordSet.Open(SELECTSTRINGDSNadOpenDynamic
    adLockOptimisticadCmdUnspecified);// 修改RecordSet.Move(StringGrid1.Row - 1EmptyParam);RecordSet.Fields[StringGrid1.Col].Value := Edit1.Text;RecordSet.Update(EmptyParamEmptyParam);RecordSet.MoveFirst;Display(RecordSet);end;procedure TForm1.VariantBtnClick(Sender: TObject);varRecordSet: OleVariant;Yi: Integer;begin// Create an empty recordset objectRecordSet := CreateOleObject('ADODB.Recordset');// Fill the recordsetRecordSet.Open(SELECTSTRINGDSNSTRING);// Display the dataY := 1;repeatfor i := 0 to 6 doStringGrid1.Cells[iY] := RecordSet.Fields[i].Value;RecordSet.Move(1);Inc(Y);until RecordSet.EOF;end;procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol
    ARow: Integer; var CanSelect: Boolean);beginEdit1.Text := StringGrid1.Cells[ACOlARow];end;end.这个程序有三个按钮,一个StringGrid以及一个编辑框,第一个按钮利用以Variants连接的ADO填充表格,第二个则利用Inteface进行连接。第三个按钮用于修改数据,当用户单击StringGrid的单元格时,单元格中的数据会显示于编辑框中,可以修改编辑框中的数据,然后单击这个按钮,将会修改这个单元格以及数据库中的数据。ADO中含有许多不同的对象,本文将集中讲述RecordSet和Fields这两个对象。可以用如下的代码生成一个RecordSet的实例:varRecordSet: OleVariant;beginRecordSet := CreateOleObject('ADODB.Recordset');... // Code omitted hereend;CreateOleObject声明于ComObj.Pas中。它是ActiveX.Pas中的核心函数CoCreateInstance的一个简单包装。要打开数据库,可利用以下代码:constSELECTSTRING = 'SELECT * FROM Clients.dbf';DSNSTRING = 'DBDemosDBase';
    beginRecordSet := CreateOleObject('ADODB.Recordset');RecordSet.Open(SELECTSTRINGDSNSTRING);.. // Code omitted hereend;Open方法有很多参数,但是在这个程序中我们只处理其中的两个。第一个是我们要执行的SQL语句,第二个是我们要操作的数据库。当打开一个数据集时,数据集游标位于第一个记录,可以用下面的代码访问这个记录:
    MyString := RecordSet.Fields[0].Value;MyString := RecordSet.Fields[1].Value;
    要移动游标,可以用RecordSet对象的Move方法:RecordSet.Move(1);利用Interface访问ADO:
    利用Interface访问ADO的步骤同从前的例子大致相同:
    procedure TForm1.InterfaceBtnClick(Sender: TObject);var RecordSet: _RecordSet;DSN: string;begin// Create an empty recordset objectOleCheck(CoCreateInstance(CLASS_RecordSetnil
    CLSCTX_ALLIID__RecordSetRecordSet));DSN := 'dsn=' + DSNSTRING;// Fill the recordsetRecordSet.Open(SelectStringDSNadOpenForwardOnly
    adLockReadOnlyadCmdUnspecified);// Display the dataDisplay(RecordSet);UpdateBtn.Enabled := True;end;
    同前一节的代码不同,这些代码必须包含ADODB_TLB.PAS。这一段代码用ADODB_TLB.PAS中声明的_RecordSet代替了Variants。这里直接调用了CoCreateInstance来生成对象的实例。第一个参数传递了声明于ADODB_TLB.PAS中的常量CLASS_RecordSet,它代表RecordSet的Class ID,第四个参数为IID__RecordSet,也是声明于ADODB_TLB.PAS中的,注意,它带有两条下划线!最后一个参数是我希望建立的实例。当调用recordSet.Open的时候,应该穿第五个参数。constSELECTSTRING = 'SELECT * FROM Clients.dbf';DSNSTRING = 'DBDemosDBase';
    begin.. // Code omittedDSN := 'dsn=' + DSNSTRING;RecordSet.Open(SelectStringDSNadOpenForwardOnly
    adLockReadOnlyadCmdUnspecified);.. // Code omittedend;在前一节的例子中,可以只传递两个参数,这是因为Variants允许忽略参数,这时采用缺省值。当采用Interfaces时,则必须明确的定义参数。如果希望采用缺省值,则可以向下面这样调用函数:RecordSet.Open(SelectStringDSNEmptyParamEmptyParamEmptyParam);在这里我们使用了EmptyParam这样一个Variant,它被声明于System.Pas,这些参数将采用缺省值。上面的例子中我用了声明于ADODB_TLB.PAS中的真正的缺省值。此类问题可参考Data Access SDK中的相关文件。打开数据集以后,就可以用同上一节相同的方法显示数据。唯一的不同就是RecordSet.Move方法要有两个参数。procedure TForm1.Display(RecordSet: _RecordSet);var Yi: Integer;beginY := 1;Repeatfor i := 0 to 6 doStringGrid1.Cells[iY] := RecordSet.Fields[i].Value;RecordSet.Move(1EmptyParam);Inc(Y);until RecordSet.EOF;end;
    修改数据当修改数据时,不能用打开数据集时使用的缺省值,而是应该传递以下的参数:constadOpenDynamic = $00000002;adLockOptimistic = $00000003;adCmdUnspecified = $FFFFFFFF;begin.. // Call CoCreateInstanceDSN := 'dsn=' + DSNSTRING;RecordSet.Open(SELECTSTRINGDSNadOpenDynamicadLockOptimistic