窗体上有控件:dbgrid,adoconnection,adoquery,adotable,datasource,为什么不能指定不了datasource的dataset属性为adoquery,只能设为adotable

解决方案 »

  1.   

    Delphi 7和SQL Server 2000實例,控件名均为系统默认,如Unit1,DataModule1,Edit1,ADOCommand1,ADODataSet1,ADOConnection1,DataSource1 等等。
    以下几个控件在连接数据库时是用得比较多的,并且通常的的连接架构是————————————————————
    数据库

    ADOConnection
    ↑ ↑
    ADOCommand ADODataSet

    DataSource

    DBGrid
    ————————————————————或者————————————————————
    数 据 库
    ↑ ↑
    ADOCommand ADODataSet

    DataSource

    DBGrid
    ————————————————————
    也就是说,ADOCommand和ADODataSet既可以通过ADOConnection连接数据库,也可以不用,分别直接连接数据库,因为这三个控件都有一个共同的ConnectionString属性。第一种比第二种更节省资源,因为当要使用多个ADOCommand、ADODataSet等控件时,使用第一种连接架构只需将所有这些控件的Connection属性设置(选择)为同一个ADOConnection,这样就只有一个ADOConnection控件与数据库打交道,毕竟连接数据库是一种比较大开销的资源,尽量节省可以提高运行速度。ConnectionString属性的设置很简单。选中要设置这一属性的控件后,再点击其ConnectionString 属性框。如果熟悉的话可以直接在这里输入,但由于这一属性值比较长,所以通常的做法是构建,并且步骤也不多,一目了然:·点击属性框后面的“...”小按钮,出现“连接源”对话框,选中“使用连接字符串”,再点击“构建...” 按钮;
    ·首先选择“提供程序”。以连接SQL Server 2000 数据库为例,提供程序选择“Microsoft OLE DB Provider for SQL Server”;
    ·点击下一步;选择或输入服务器名框中,可以输入计算机名,也可使用计算机的IP地址,特别地,如果是单机使用的,可输入一个便于移植使用的IP地址,即指向本机的IP地址“127.0.0.1”;
    ·登录服务器信息,如果SQL Server 是集成登录的,选中“使用Windows NT 集成安全设置(W)”,然而多数情况下是选中“使用指定的用户名和密码”,并分别输入登录数据库的用户名和密码,通常是sa用户,而且如果是空密码的,可以选中下面的“空白密码”,至于“允许保存密码”,选不选就看个人喜好了;
    ·“在服务器上选择数据库”,选中所要连接的数据库;
    ·最后点击“测试连接”,通常会弹出“测试成功”的提示,确定即可。当然,前提是SQL 服务管理器已启动。ADOCommand适合执行无返回结果的SQL语句,如插入、删除、更新等;ADODataSet则用于执行有返回结果的SQL语句,如查询;两都都有一个共同的CommandText属性,用以设置其所要执行的 SQL语句。通常所要执行的SQL语句不是固定不变的,而是在程序运行时根据用户的操作动态生成的。对于ADODataSet,可双击相应按钮(如“提交查询”),在其onClick事件中相应的SQL语句赋值语句,再将ADODataSet的CommandText属性设置为该字符串,最后改变ADODataSet 的Active属性即可,如:sql:='select * from ....'; //其中sql为已定义的String类型变量
    ADODataSet1.Active:=false;
    ADODataSet1.CommandText:=sql;
    ADODataSet1.Active:=true;执行查询操作后,判断查询结果是否为空,如果非空,并且可以确定查询结果是唯一,则可分别直接引用查询结果的各个字段:if (ADODataset1.FieldValues['字段名1']<>NULL) then
    //此处的“字段名1”为查询结果中的字段名,即数据库里相应表的字段名
    begin
    Edit1.Text:=ADODataset1.FieldValues['字段名1'];
    //可引用查询结果,分别为各Edit控件的Text属性赋值,使之显示
    Edit2.Text:=ADODataset1.FieldValues['字段名2'];
    //等等
    end而如果查询结果不唯一,也可逐一引用各字段,不过需要稍加修改。而此时最常用的是向下拉框Combobox控件中添加项目,并且通常放在窗体的onShow事件中执行:______________________________________________________________________________unit Unit1; //当前窗体文件名interfaceuses
    //.....
    type
    //……//...procedure TForm1.FormShow(Sender: TObject); //窗体的显示事件
    var
    i,j:integer; //for循环变量只能是局部变量
    sql,item:String //字符串型
    begin
    //...sql:='select 字段1 from ....'; //通常是查询单个字段
    ADODataSet1.Active:=false;
    ADODataSet1.CommandText:=sql;
    ADODataSet1.Active:=true;j:=ADODataSet1.RecordCount; //j和后面的i定义为整形变量
    ADODataSet1.First; //使指针指向(移动到)第一条记录
    Combobox1.Items.Clear; //下拉框Combobox1.Items.Add('请选择...'); //添加一个提示项到下拉框项目中
    for i:=1 to j do //j为查询结果的记录数
    begin
    item:=ADODataSet1.FieldValues['字段1'];
    //逐一引用当前记录的指定字段值
    Combobox1.Items.Add(item); //添加到下拉框项目中
    ADODataSet1.Next; //指针移动,指向下一条记录
    end;
    Combobox1.Text:='请选择...'; //显示提示值
    //...end;//...end.
    ______________________________________________________________________________这样,在程序运行时打这个Form1窗体,该Combobox1下拉框的显示值就为“请选择...”,点击下拉框,其中就会有从数据库中查询出来的各个项目显示出来,以供用户选择。毕竟选择比输入快,而且如果输入的话,还要用户记住其内容,非常不方便。
    至于查询有多个返回结果并且查询多个字段的,可以用DBGrid控件以表格形式显示全部查询结果,不过此时需要添加一个DataSource控件,并且将将DBGrid的DataSource属性设置为该DataSource 控件,再将该DataSource的DataSet属性设置为相应的ADODataSet控件,如上面的连接架构所示。对于ADOCommand,稍稍有点不同。因为它是通过Execute方法执行SQL语句的:begin
    sql2:='insert into 表1 ......';
    //可用于执行insert into,update,delete语句
    ADOCommand1.Execute;
    showmessage('操作成功。'); //操作完成后给出提示
    end如果要使用的ADOCommand、ADODataSet等控件不多时,可以不用ADOConnection 控件,直接使用ADODataSet和(或)ADOCommand控件,只需分别设置其ConnectionString 属性;若要使用多个ADOCommand、ADODataSet等控件时,有一个办法可以节省使用控件的数量:建立一个DataModule窗体,假设窗体名为DataModule1,并将ADOConnection、ADOCommand、 ADODataSet、DataSource等数据库控件建立在该DataModule1窗体中,然后在所有需要使用这些控件连接数据库的窗体中使用该DataModule1窗体。如果该DataModule1 窗体名保存为Unit2文件,则在需要使用这些控件的Uses列表中加入Unit2即可,但在引用时需要在控件名前加上窗体名,如:unit Unit3; //当前窗体文件名interfaceuses
    //.....
    Unit2; //引用DataModule1窗体的窗体文件名Unit2type
    //……DataModule1.ADODataSet1.Active:=false;
    DataModule1.ADODataSet1.CommandText:=sql;
    DataModule1.ADODataSet1.Active:=true;
    //...
    Edit1.Text:=DataModule1.ADODataset1.FieldValues['字段名1'];
    //...
    DataModule1.ADOCommand1.Execute;也就是:如果所使用的控件不是在当前窗体的,而是通过使用窗体引用的,就需要在控件名前加上窗体名。或者可以这样省略窗体名:with DataModule1 do
    begin
    ADODataSet1.Active:=false;
    ADODataSet1.CommandText:=sql;
    ADODataSet1.Active:=true;
    //...
    end
      

  2.   

    贴上一个可以参考着用...Procedure FlashServerList();
    Var StrSQL,Sv:String;
      tAdo:TADOConnection;
      tQuery: TADOQuery;
    Begin
      tAdo:=TAdoConnection.Create(nil);
      tQuery:=TAdoQuery.Create(nil);;  tADO.LoginPrompt:=False;
      tAdo.ConnectionString:=MyConnectString; //SQL连接字符串
      tQuery.Connection:=tAdo;  StrSQL:='select DISTINCT server from mail order by server';
      tQuery.SQL.Clear;
      tQuery.SQL.Add(StrSQl);
      tQuery.Open;
      while not tQuery.Recordset.EOF do
      Begin
      SV:=tQuery.Fields[0].asString;
      Form1.ListBox_Server.Items.Append(SV);
      tQuery.Next;
      end;
      tQuery.Close;
      tQuery.Destroy;
      tAdo.Close;
      tAdo.Destroy;
    end;
      

  3.   

    最少三个控件: 
    1.dbgrid 。 
    2.datasource 在data access里面 
    3.adoquery。 
    设置 adoquery的connection。可以写语句 
    也可以放置 adoconnection在ado里面 
    设置adoconnection的connectstring 
    设置 datasource的dataset为adoquery1 
    设置 dbgrid的datasource为datasource1 begin 
    with adoquery1 do 
    begin 
    close; 
    sql.clear; 
    sql.add('select * from table'); 
    open; 

    sql.add('insert into table (a,b,c) value(a,b,c)'); 
    execsql; 


    sql.txt:='update table set a=a '; 
    execsql; 

    end; 
    end;