由于要对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
但是在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
解决方案 »
- 函数返回值 不管什么调用约定都是在EAX?
- dll动态调用
- 在delphi中,如何根据一个字段中的某些字符对数据库进行排序???
- 老大们帮帮忙啊
- 请问TQqury的属性requestlive和cachedupdates的区别和分别作用,在那种情况下适用其中的那一种?
- 怎样用delphi编写程序获取program1.exe程序窗体中的所有组件列表信息(在线)?
- 不会吧,难道这个问题真的没有人能搞定吗?
- html组件
- 如何将一个table控件赋给与它属性完全等同的另一个table!急!!!
- 简单的问题:怎样将‘2001-10-12’变成‘2001-11-12’*******40分********
- 菜鸟级问题!!!!在线等
- DBGRID中如何把某一列变为可以有下拉框的功能???
改为
edit1.Text := sqlquery1['street_name'];
试试