Foxtable(狐表)用户栏目专家坐堂 → [求助]调用access的存储过程


  共有3306人关注过本帖树形打印复制链接

主题:[求助]调用access的存储过程

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]调用access的存储过程  发帖心情 Post By:2021/2/26 7:01:00 [只看该作者]

使用的外部数据源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()


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/2/26 9:59:00 [只看该作者]

查询表不能传参数?那查询表好大的哟,耗时太长了。我是想传参在access中查

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/2/26 10:11:00 [只看该作者]

肯定可以,请贴出完整代码

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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,就没问题。


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/2/26 10:25:00 [只看该作者]

查询表XYZ的语句本来就应该是: select * from TbAAA

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

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/2/26 10:28:00 [只看该作者]

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

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/2/26 10:38:00 [只看该作者]

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

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



 回到顶部