首页 > 开发 > 综合 > 正文

Excel 2000访问远程数据的四种方法

2024-07-21 02:06:49
字体:
来源:转载
供稿:网友
     excel 2000作为一个电子表格软件,它不仅有强大的数据处理能力,而且它的报表功能也是十分强大。因而常常用excel 2000去调用access、sql server、oracle、db2等数据库软件建立的大型数据库的内容。用户可以在工作表中对这些数据进行筛选、排序、查询、编辑和打印报表,十分方便,这也是大多数人都熟悉的。但如何去调用这数据呢?本人在这里提供4种方法。
    下面四种方法必须要先创建一个数据源,我们以sql server7.0内的样本数据库pubs为例。在控制面板/odbc数据源/系统dsn,单击增加按纽,选取sql server驱动程序,建立一个与pubs数据库连接的叫pubs名称数据源。
           方法一:
    在excel 2000中,选择 数据/获取外部数据/新建数据库查询,然后按向导的提示一步一步做,最后将数据返回excel 2000中就行了
    这种方法是大家常用的,也是最方便的。但这种方法只能对远程数据进行查询,不能对远程数据进行增加和修改。
    方法二:
    这种方法需要vba编程(方法三、方法四也一样),在visual basic编程中,我们经常用ado来访问数据。ado是microsoft提供的针对各种各样数据源的新型高级编程接口。它支持大多数据库操作,在excel 2000中应用ado来访问数据,是十分理想的方法。看看下面一个实例:
    sub opendb()
    dim cn as adodb.connection
    dim rs as adodb.recordset
    set cn = new adodb.connection
    set rs = new adodb.recordset
    cn.open "provider=msdasql.1;persist security info=false;data source=pubs"
    rs.open "select * from authors", cn
     range("a1").copyfromrecordset rs
     rs.close
    cn.close
    end sub
    宏中第一、二句定义了一个ado 的connection对象和一个recordset对象,第三、四句创建了一个ado 的connection对象和一个recordset对象。第五句连接到前面我们建立的数据源pubs数据库。第六句是ado 的recordset对象执行一条sql里select语句。在这也可以执行insert,update等等sql语句的。第七句是将rs里的记录返回当前表里。第八、九句是关闭连接。运行前要在excel 2000工具/引用中引用ado的库文件。
           在excel 2000中应用ado对象,不仅可以对数据库进行查询,而且可以作增加,修改数据库的记录,甚至可以调用sql server7.0的存储过程,加强excel 2000对数据库处理能力。
    方法三:
    excel 2000的功能是十分强大的,它自带了一个odbc加载宏,我们在excel 2000中引用这个宏文件xlodbc.xla,就可以通过下面的方法去访问我们建立的数据源了
    sub opendb()
        dim id as integer
        id = sqlopen(“dsn=pubs”)
        sqlexecquery id, “select * from authors”
        set output = worksheets("sheet1").range("a1")
        sqlretrieve id, output, , ,
        true sqlclose id       
    end sub
    第二句是调用xlodbc.xla宏中的sqlopen函数建立一个对数据库pubs连接,第三句是sqlexecquery函数执行了一条select语句,id是由 sqlopen 函数返回的唯一连接标识,第四句是sqlretrieve函数将sqlexecquery函数执行的查询的结果返回到excel 2000中。
           这种编程方法可以说来的容易,用得方便。也是一种好的访问远程数据方法。
    方法四:
    这种方法是使用api方法,下面是一个实例
        '分配环境句柄
    res = sqlallochandle(sql_handle_env, sql_null_henv, henv) 
    '设置环境属性
        res = sqlsetenvattr(henv, sql_attr_odbc_version, sql_ov_odbc3, 0)
        '分配数据库连接句柄
        res = sqlallochandle(sql_handle_dbc, henv, hsvr)
    '连接到数据源
    sconnect=“dsn=pubs;database=pubs“
    res=sqldriverconnect(hsvr,byval,0&,sconnect,len(sconnect),sconnout, len(sconnout), _ nconnoutlen, 0)
    ssql =“select * from authors“
    res = sqlexecdirect(hsel, ssql, len(ssql))
    '将记录返回当前表里
    res=sqlnumresultcols(hsel, nc)
    do while (sqlfetch(hsel) <> sql_no_data_found)
    j=j+1
    for i=1 to nc
       res = sqlgetdata(hsel, i, sql_c_char, tmp, 512, pl)
       cells(j, i) =tmp
    next i
    loop
    '释放数据库连接句柄
          res = sqlallochandle(sql_handle_stmt, hsvr, hsel)
    '释放数据库连接句柄
          ret = sqlfreehandle(sql_handle_env, henv)
    这种方法比较复杂,调试也比较困难,但运行速度快,在进行大量查询数据和自己在api调用方面比较熟时,可以用这个方法。在用上面的实例时,要做api声明和常量的定义。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表