由于要对MySQL数据库进行编程和操作,所以接触到了SQLConnection(呵呵,以前一直用ADOConnection),不过也因此而碰到了许多麻烦。通过ADOConnection,我们可以把把ADOQuery中的数据直接送到DataSource中,此时所有指到这个DataSource的数据控件就可以求得ADOQuery的数据了。
但是在SQLConnection中,我们在SQLQuery和DataSource之间还得通过DataSetProvide和ClientDataSet控件,,也就是先设定DataSetProvider的DataSet为SQLQuery,ClientDataSet的ProvideName为DataSetProvider,DataSource的DataSet为ClientDataSet。其示意图如下:
TSQLConection ---> TSQLQuery(TSQLTable) ---> TDataSetProvider ---> TClientDataSet ---> TDataSource ---> 各种DataControls组件连接数据库,两者基本相似。但是在处理DataSource的onDataChange事件时发现有一点差别。
代码如下:
(SQLConnection)
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  edit1.Text := sqlquery1.FieldValues['street_name'];
end;(ADOConnection)
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  edit1.Text := adoquery1.FieldValues['street_name'];
end;在ADOConnection中一切正常,edit1中的内容随着数据行的变化而变化,但是在SQLConnection中碰到了一些问题,刚运行时就提示出错:Project Project2.exe raised exception class EDatabaseError with message 'Cannot perform this operation on a closed dataset'.Process stopped.Use Step or ?Run to continue.
根据提示,我没有打开数据集(声明:我在他们的属性Active项都设成了true),既然这样,我把SQLConnection的代码改为
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if SQLConnection1.connected = false then
     SQLConnection1.connected := true;
  if SQLQuery1.active= false then
     SQLQuery1.active:= true;
  if ClientDataSet1.active= false then
     ClientDataSet1.active:= true;
  //这样我保证了数据库的连接,也不会每次都重复连接
  edit1.Text := sqlquery1.FieldValues['street_name'];
end;
运行通过,可是更奇怪的是无论我如何改变当前数据行,edit1的内容总是不变,而相同的操作在ADOConnection中正常,请高手告知!!!! 谢谢!!1