以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]调用access的存储过程  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=160912)

--  作者:chnfo
--  发布时间:2021/2/26 7:01:00
--  [求助]调用access的存储过程
使用的外部数据源access作为数据库,本来access是没有存储过程的,CSDN将之定义为查询,也可以参数化调用
CSDN网帖地址:https://blog.csdn.net/zyjq52uys/article/details/88576853

但其用法与帮助里的存储过程不一样。
如果按这个帖的用法,狐表调用方法应当怎么用呢?

如何在狐表的命令窗口测试下述的存储过程?

Dim conn As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\XYZ$\\MyData.mdb;Persist Security Info=False")  \'-----这里就直接报错了,提示未定义类型OleDb.OleDbConnection,后面的就没法试了
        \'打开数据库
        conn.Open()
        \'生成命令
        Dim cmd As New OleDbCommand()
        cmd.CommandType = CommandType.StoredProcedure \'设置使用存储过程
        cmd.Connection = conn
        cmd.CommandText = "StoredProcedureWithParameters" \'存储过(查询对象)的名称
        cmd.Parameters.Add("@cityer", OleDbType.VarChar, 5).Value = "物主"
        cmd.Parameters.Add("@cityerr", OleDbType.VarChar, 10).Value = "天津"
        \'执行命令
        Dim adapter As New OleDbDataAdapter()
        adapter.SelectCommand = cmd
        \'填充DataTable
        Dim dt As New DataTable
        adapter.Fill(dt)
        DataGridView1.DataSource = dt
        \'关闭数据库
        conn.Close()


--  作者:有点蓝
--  发布时间:2021/2/26 8:53:00
--  
首先access不存在存储过程这种东西,查询不是存储过程,类似SQL server的视图。和普通sql一样使用即可:http://www.foxtable.com/webhelp/topics/3266.htm

Dim cmd As new SQLCommand
cmd
.ConnectionName = "数据源名称"
cmd
.CommandText = "SELECT * FROM 某查询名称 WHERE 日期 >= ? AND 日期 <= ?"
cmd
.Parameters.Add("@开始日期",#2/1/2018#)
cmd
.Parameters.Add("@结束日期",#3/31/2018#)
Dim
 dt As DataTable = cmd.ExecuteReader()

--  作者:chnfo
--  发布时间:2021/2/26 9:49:00
--  
在命令窗口执行报错哦。提示:至少一个参数没有指定值。外部查询表名加不加大括号都不行。我在外部数据源定义了一个查询表X:sel.ect *from 订单 where 客户 = kh and 日期 = Rq . 然后text= se.lect * from x where 客户=? And rq =?”
[此贴子已经被作者于2021/2/26 9:55:35编辑过]

--  作者:chnfo
--  发布时间:2021/2/26 9:59:00
--  
查询表不能传参数?那查询表好大的哟,耗时太长了。我是想传参在access中查
--  作者:有点蓝
--  发布时间:2021/2/26 10:11:00
--  
肯定可以,请贴出完整代码
--  作者:chnfo
--  发布时间:2021/2/26 10:22:00
--  
比如外部数据源连接名为“CS”,其中有一个查询表XYZ,它的查询语句是 sel.ect * from TbAAA where xid = strm and yid = strn  \'\'\'这里的strm和strn就是需要外部引入的参数

Dim cmd As new SQLCommand
cmd
.ConnectionName = "CS"
cmd
.CommandText = "SEL.ECT * FROM XYZ WHERE xid = ? and yid = ?"
cmd
.Parameters.Add("@xid","aaaaa")
cmd
.Parameters.Add("@yid","bbbbb")
Dim
 dt As DataTable = cmd.ExecuteReader()

这样执行肯定是报错的。
但如果把查询表XYZ的语句换成 sel.ect * from TbAAA,就没问题。


--  作者:有点蓝
--  发布时间:2021/2/26 10:25:00
--  
查询表XYZ的语句本来就应该是: select * from TbAAA

where xid = strm and yid = strn这个没有任何意义,本来就是在代码里传入的:WHERE xid = ? and yid = ?

--  作者:chnfo
--  发布时间:2021/2/26 10:28:00
--  
但如果多表查询的时候,还有一些join之类的,按理说,每个表先按条件过滤再join,似乎效率要高一些。
如果把查询条件放在外面,效率可能会降低,那用查询视图就没太大价值了,还不如直接SQL

所以,数据量大的时候,要么换数据库;要么直接用SQL语句?
[此贴子已经被作者于2021/2/26 10:28:48编辑过]

--  作者:有点蓝
--  发布时间:2021/2/26 10:38:00
--  
把查询和视图看作是一个表来理解就行了,表格可以在数据库添加条件的吗?如果还不理解,建议百度一下。查询本身是不存储数据的,简单的可以理解为是包装了一段SQL的代理工具,调用的时候才会有查询效率的问题,如果查询条件需要外部传入,就只能放到外面。外面传入的条件一样可以影响查询本身的效率。

当然,如果可以建议使用sqlserver,毕竟sqlserver对视图功能进行了一定的优化,已经提前对里面的sql进行了编译,相对执行普通sql会更快一点