是不是dbexpress+mysql方案有bug?提示自动生成的sql语句执行错误,却并没有说错在哪儿,
而且错误提示框中的sql只有半句,
如何调试,

解决方案 »

  1.   

    还没研究过,转贴一篇:
      
    DBExpress 提高——程  健Email: mailto:[email protected]  一、TSQLConnectionTSQLConnection和Tdatabase,、TADOConnection\TIBDatabase一样,继承自TcustomConnection. TcustomConnection提供了Connected,DataSetCount, DataSets,LoginPrompt、StreamedConnected等常用属性。1、dbxconnections.ini和dbxdrivers.ini在讨论TSQLConnection的之前,让我们先看看dbxconnections.ini和dbxdrivers.ini,它们默认存放在.\Borland Shared\dbExpress\,dbxdrivers.ini中保存着各种dbExpress驱动程序信息,所需要的库信息(DLL),默认参数设定;dbxconnections.ini保存每个连接的具体设定(在dbExpress Connections对话框中看到的信息)。2、TSQLConnection的重要属性Connected:是否连接到数据库;ConnectionName:连接名称,可以双击TSQLConnection控件进行设定、增减;DataSets:当前所有连接到本SQLConnection的活动DataSet(包括TSQLDataSet、TSQLTable、TSQLQuery、TSQLStoredProc);DriverName:驱动程序名;KeepConnection:保持连接状态;TableScope:此属性决定当取得数据库中表时返回表的类型。其定义如下:type  TTableScope = (tsSynonym, tsSysTable, tsTable, tsView);  TTableScopes = set of TTableScope;property TableScope: TTableScopes;  TTableScope = (tsSynonym, tsSysTable, tsTable, tsView);  TTableScopes = set of TTableScope;其中:tsSynonym:返回重名表tsSysTable:返回系统表tsTable :返回普通表tsView views:返回视图VendorLib:返回dbExpress与数据库服务器连接所需的DLL。3、重要方法CloseDataSets:关闭与此SQLConnection连接所有活动DataSet(包括TSQLDataSet、TSQLTable、TSQLQuery、TSQLStoredProc);StartTransaction、Commit、Rollback:一组处理事务的命令,应该都很熟悉了。先执行StartTransaction,然后执行关键任务,如果执行Commit,则保存执行结果,如果执行RollBack,则取消上一次StartTransaction或Commit到目前为止所有任务。给出简单实例(摘自Delphi帮助):procedure TForm1.TransferButtonClick(Sender: TObject);var  Amt: Integer;  TD: TTransactionDesc;begin  if not SQLConnection1.InTransaction then //如果目前不在一个事务中  begin    TD.TransactionID := 1;    TD.IsolationLevel := xilREADCOMMITTED;    SQLConnection1.StartTransaction(TD);    try      Amt := StrToInt(AmtEdit.Text);      Debit.Params.ParamValues['Amount'] := Amt;      Credit.Params.ParamValues['Amount'] := Amt;      SQLConnection1.Commit(TD); //一切顺利则递交    except       SQLConnection1.Rollback(TD); //发生任何错误则回滚    end;  end;end;         Execute:执行一条SQL语句;function Execute(const SQL: string; Params: TParams; ResultSet:Pointer=nil): Integer;参数:SQL:需要执行的SQL语句;Params:Tparams类型,执行此SQL的参数;      ExecuteDirect:执行不带参数的SQL语句;。function ExecuteDirect(const SQL: string ): LongWord;                  参数为需要执行的SQL语句,如果执行成功则返回0。       GetFieldNames,GetIndexNames,GetProcedureNames,GetProcedureParams,GetTableNames:获得有关信列、索引、存储过程、存储过程参数、表名等信息。4、事件TSQLConnection的事件相当简单,也相当易懂OnLogin、AfterConnect、AfterDisconnect、BeforeConnect、BeforeDisconnect。         二、TSQLDataSetTSQLDataSet 继承自TCustomSQLDataSet ,而TCustomSQLDataSet继承自TdataSet。所以,其大多数方法、属性、事件大家都很熟悉了。其重要属性如下:CommandText:向数据库服务器发送的命令;         CommandType:决定命令类型,其定义如下:type TSQLCommandType = (ctQuery, ctTable, ctStoredProc);property CommandType: TSQLCommandType;ctQuery:此命令是一条需要执行的SQL语句;ctStoredProc:命令是一个存储过程名;ctTable:命令是数据库服务器上的表名,系统会自动生成SELECT语句返回记录。         DesignerData:字符类型,没有任何实际意义,我们可以保存任何信息在此属性中。         MaxBlobSize:整数型,BLOB类型数据的最大值。如果为-1,则返回所有数据。         SQLConnection:指向TSQLConnection对象,以连接数据库服务器。三、TSQLClientDataSetTSQLClientDataSet是一个在使用类似于TClientDataSet而在内部使用了TSQLDataSet和TSQLProvider的组件。这意味着,它可以使用dbExpress的机制来访问数据库,而又能在内存中保存让用户浏览、修改,最后递交到数据库服务器(这也牺牲部分性能)。这就在数据库访问性能和易操作性间给出了平衡。这里,我们给出了一个实例来正式这一点(dbsqlclientdataset2)。我们使用一个TDBGrid,一个TDBNavigator,一个TSQLConnection,一个TSQLClientDataSet,一个TButton组成了一个最简单的程序。图 1TSQLClientDataSet的实例    我们可以清晰的看到,在按了Button1后执行了  SQLClientDataSet1.ApplyUpdates(-1);,数据被修改了。    这里又给出了一个使用TClientDataSet连接dbExpress数据源的例子(dbsqlclientdataset2\),就和连接其它数据源一样,这和TSQLClientDataSet并没有联系。由于可以达到类似的效果,我们给出实例。遗憾的是,在Borland文档中,不推荐使用TSQLClientDataSet作主要/明细结构,因为,TSQLClientDataSet无法在这样的情况下优化查询。四、多层应用MIDAS为什么要用dbExpress?dbExpress的设计目的是什么? 在传统的Client/Server程序中,为了提高这点性能,牺牲那么多程序开发中的灵活性值得吗?我个人认为,dbExpress是为了多层应用而设计的。在应用程序服务器上,使用单向数据集,可以把访问数据库的效率提到最高,而在客户端的开发又不受任何影响。这真实鱼与熊掌兼得之、用dbExpress开发Midas应用程序和以前几乎一样,我们给出了实例(Midas\)。五、调试dbExpress(Debugging)根据Delphi6帮助说明,你可以使用两种方法跟踪dbExpress的行为、第一种方法是使用TSQLConnection控件的SetTraceCallbackEvent方法。这是一个CallBack方法,以后每当SQLConnectin向数据库服务器发送命令,就会触发你的CallBack事件。由于这个方法比较复杂(其实也不复杂,可如果你不熟悉Windows的Callback概念,那它真的复杂了),我们不对其进行详细介绍。为了方便用户,Delphi提供了第二种方法——TSQLMonitor控件,它封装了SetTraceCallbackEvent方法。设定SQLMonitor的SQLConnection属性为需要调试的TSQLConnection控件,设置其Active为True,以后,每当通过SQLConnection向数据库服务器发送命令,其TraceList属性(TStringList)会被更新,且会触发LogTrace事件;如果你希望自动保存这些信息,可以设置TSQLMonitor的Filename属性及AutoSave属性。根据一段Delphi帮助中的代码就很说明问题:procedure TForm1.SQLMonitor1LogTrace(Sender: TObject; CBInfo: Pointer);var  LogFileName: string;begin  with Sender as TSQLMonitor do  begin    if TraceCount = 10 then    begin      LogFileName := 'c:\log' + IntToStr(Tag) + '.txt';      Tag := Tag + 1; {ensure next log file has a different name }      SaveToFile(LogFileName);      TraceList.Clear; { clear list }    end;  end;end;
      

  2.   

    使用的MYSQL数据库版本太新了,换称readme.txt文件中说的版本看看