datacombo可以将数据库中查询结果的一列显示在下拉列表中 用作用户选择  程序设计时经常会用到   
我的问题是关于datacombo控件数据源的问题,这个问题困扰我好久,都有哪些可以作为数据源呢,当然ADODC控件是可以的  但是这个太麻烦每个form都要弄一个还要设置visible=false  所以我想有没有其他的方法  问题也就由我的尝试引出问题1: 我定义了一个全局的变量rst as adodb.recordset   然后我写了一个函数,searchsql(byval sqlstr as string ,byref rst as adodb.recordset)  作为统一的查询函数 将查询结果放在 rst (adodb.recordset对象)中
接着问题就来了  当将rst 赋值给 set datacombo.DataSource = rst ; DataCombo.DataField = rst.Fields(1) 运行后 在控件的下拉列表中  只有一个记录  说明  rst不是记录集的形式只是一条查询结果??    有什么办法没有让rst是结果集的形式????(searchsql函数运行正常)
问题2:接着我尝试了使用数据环境dataEnvironment  创建的环境叫 DE 由于查询要传一个参数  所以我写了一个存储过程 pro_test  同样的将datacombo控件的DataSource 选为DE  datamember选为那个在DE中创建的存储过程pro_test  DataField选为存储过程查询的结果字段 ,listfield、databind、rowfield 、rowsource 全都选了该选的   但是运行结果是datacombo控件的下拉列表为空   中断监视了存储过程的执行 结果正常且完整   难道是MSDN中说的那样 存储过程没有返回记录(确实存储过程的定义,顶多返回几个参数(output声明),不可以返回结果集)??  可是为什么通过rspro_test(其recordset对象)  可以枚举到每一条结果  这些结果又是怎么来的   
  问题3:问题2我假设是因为存储过程没有返回结果集,所以我又写了一个内嵌表值函数fun_test('')返回值是一个表  然后问题又来了,在数据环境中不可以创建函数的调用  只能创建存储过程  DE中添加子命令时可以找到创建的这个函数 但是在其属性|高级|中显示的嵌入式sql的格式不对,是CALL fun_test ''就是和存储过程的格式一样  这样显然是不对的  内嵌表值函数的执行方式  和查询语句的形式一致的  select * from fun_test('') 自然他那个运行会报错  确实也就报错了
问题4:OK不能用存储过程,也不能用函数,那我在数据环境中创建一个SQL语句的命令,经测试,确实可以作为datacombo的数据源,下拉列表中是全部的查询结果,但是问题又来了,需要的这个查询语句不是无条件的全表查询,当然也不是固定查询条件的查询,就是说要根据用户的输入查询,所以要往查询语句中传参数,可是数据环境中创建的这个SQL语句的命令,只能在设计器中填写,不可以在代码行给其commandtext重新赋值,所以说这个commandtext只能是在设计阶段写死的     大家谁知道怎么在代码行给commandtext重新赋值问题5:大家在用datacombo时都是用怎样的数据源    有没有简单方便的形式  而不是用麻烦的 adodc

解决方案 »

  1.   

    假设rs1中的数据是记录中数据,显示的字段Field_s假设rs2中的数据为目标表的数据 ,既rs2中某个字段Field_x数据来源于rs1sub form_load
    set rs1=cnn.execut(....)'加载rs1数据
    set rs2=cnn.execut(....)'加载rs2数据with datacombo1
    set .datasource=rs2
    set .rowsource=rs1
    .datafield="Field_x"
    .listfield="Field_s"
    end sub
      

  2.   


    我明白关于问题1  我错在哪里了    我把recordset对象 作为数据源了  这样是不对的  应该用一个数据库连接作为数据源(有待测试)   GOT IT!!!     哎 还是MSDN看的不够仔细   这个在MSDN里明明写的很清楚  “返回或设置一个数据源,通过该数据源,数据使用者被绑定到一个数据库”  当然recordset对象也可以  但是就会想我之前的那样  只有一行数据    谢谢啦    不过关于您写的  我还是有一点不明白   如果我重新理解的是对的话   那您这样  在程序运行后得到的应该也是一行记录才对    如果我的理解不对的话    那您为什么用两个recordset对象,rst1是rst2的子集,这样光用rst2应该就够了   我没有理解用两个的原因和目的还有  问题2 3 4   我也想知道答案  特别是问题2 和问题4  
    谢谢!!!
      

  3.   

    我重新认真的看了  MSDN中  关于datacombo的每个属性的说明   明白了 您设置两个rst的目的   
    谢谢  之前的理解还是错误的   现在的理解不能说正确  但是已经不是太离谱了    
    MSDN是好东西  当然CSDN 也是不错的  
      

  4.   

    最终的结果是  问题1不成立  可以呈现结果集的形式  但是因为我没有搞清楚  datasource  和 datafield  以及 databandings  是干什么用的  所以导致了错误   但是我还是想知道  如果用  数据环境的 话 如何操作呢
    请问您知道吗
      

  5.   

    数据环境和adodc很类似,最终也是操作记录集,只是数据显示控件可以连接到数据环境而已一般,我都不使用adodc也不使用数据环境,直接使用记录集及connection对象
      

  6.   

    数据源变动很好解决:sConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\Administrator\桌面\a.mdb;Persist Security Info=False"
    硬编码改成:sConnA="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=xxxDataPathxxx;Persist Security Info=False"(可以作为全剧常量定义)然后在你选择数据库的时候:确定数据库sDBFile 后sConn=replace(sConnA,"xxxDataPathxxx",sDBFile)
    conn.activeconnection=scoon
    conn.open