Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在VBA中使用KDB+/qodbc.dll的ADO

在VBA中使用KDB+/qodbc.dll的ADO
EN

Stack Overflow用户
提问于 2014-07-05 06:30:25
回答 1查看 1.2K关注 0票数 5

我有一个基于Excel的应用程序,它依赖于我使用ADO (Microsoft数据对象6.1Library)连接到的几个不同的数据库。数据库驻留在区域服务器上,建立初始连接存在开销,因此我将连接缓存在Scripting.Dictionary对象中以供重用。

代码语言:javascript
运行
AI代码解释
复制
Private moConnCacheDict As Scripting.Dictionary

当我使用kdb+ qodbc.dll数据库驱动程序时,我会得到意想不到的行为。我可以像预期的那样连接和重用多个数据源(Oracle、Sybase、Access)和一个KDB数据库实例。但是,如果创建第二个KDB数据库连接并在新数据集上执行查询,则尽管查询是合法的,也不会返回任何数据。

代码语言:javascript
运行
AI代码解释
复制
Recordset.BOF = TRUE and Recordset.EOF = TRUE 

它看起来执行得很好,而且字段是可见的。与前一个区域服务器的连接似乎持续存在,我可以成功地检索驻留在原始服务器上的数据,尽管如果我查看,

代码语言:javascript
运行
AI代码解释
复制
Recordset.ActiveCommand.ActiveConnection.Properties.Item("Extended Properties")

,是新的连接字符串。

KDB+连接字符串使用以下语法:

代码语言:javascript
运行
AI代码解释
复制
DRIVER=kdb+;DBQ=XXXXX;UID=XXXXX;PWD=XXXXX;

我已经包含了用作示例的核心VBA函数:

代码语言:javascript
运行
AI代码解释
复制
Private Function ExecuteQuery(sDBName As String, ByRef oRst As ADODB.Recordset, Optional bDeleteConnection As Boolean) As Boolean
Dim oDBConn As ADODB.Connection
Dim sSql As String

'delete connection
If bDeleteConnection Then Call DropConnection(sDBName)

'get cached or new connection
Call GetConnection(sDBName, oDBConn)

Select Case sDBName
Case "MAIN_US"
    sSql = mSQL_MAIN
Case "MD_ASIA"
    sSql = mSQL_MDASIA
End Select

Set oRst = New Recordset
oRst.Open sSql, oDBConn, adOpenKeyset, adLockPessimistic

If Not oDBConn.State = adStateOpen Then Err.Raise vbObjectError + 1024, "ExecuteQuery", sDBName & ": Recordset Closed. Unable to execute query ->" & sSql

ExecuteQuery = True

End Function

Private Function GetConnection(sDBName As String, ByRef oDBConn As ADODB.Connection) As Boolean

If moConnCacheDict Is Nothing Then Set moConnCacheDict = New Dictionary

If moConnCacheDict.Exists(sDBName) Then
'get existing connection
Set oDBConn = moConnCacheDict.Item(sDBName)
Else
'create connection
Set oDBConn = New Connection

With oDBConn
    .Mode = adModeRead
    Select Case sDBName
    Case "MAIN_US"
        .Mode = adModeReadWrite
        .ConnectionString = mCONN_MAIN
    Case "MD_ASIA"
        .Mode = adModeRead
        .ConnectionString = mCONN_MDASIA
    End Select

    .CursorLocation = adUseServer
    .Open
End With

moConnCacheDict.Add sDBName, oDBConn

End If

GetConnection = True

End Function

Private Function DropConnection(Optional sDBName As String) As Boolean
Dim oDBConn As ADODB.Connection
Dim i As Integer

    'delete object directly from cache
    If Not moConnCacheDict Is Nothing Then
        If sDBName = vbNullString Then
                'close all connections
                For i = 0 To moConnCacheDict.Count - 1
                    If Not IsEmpty(moConnCacheDict.Items(i)) Then
                        Set oDBConn = moConnCacheDict.Items(i)
                        If Not oDBConn Is Nothing Then
                            If oDBConn.State = adStateOpen Then oDBConn.Close
                            Set oDBConn = Nothing
                            Debug.Print Now, "Dropping Database Connection - " & moConnCacheDict.Keys(i)
                        End If
                    End If
                Next i
                Set moConnCacheDict = Nothing
            Else
            If moConnCacheDict.Exists(sDBName) Then
                If Not IsEmpty(moConnCacheDict.Item(sDBName)) Then
                    Set oDBConn = moConnCacheDict.Item(sDBName)
                    If Not oDBConn Is Nothing Then
                        If oDBConn.State = adStateOpen Then oDBConn.Close
                        Set oDBConn = Nothing
                        Debug.Print Now, "Dropping Database Connection - " & "Dropping Database Connection - " & sDBName
                    End If
                End If
                moConnCacheDict.Remove (sDBName)
            End If
        End If
    End If

DropConnection = True

End Function

(注意,调用方总是关闭ADO.Recordset并将其设置为空)。

解决此问题的唯一方法是关闭所有数据库连接(不管提供程序如何),然后重新连接到所需的区域服务器。这是可怕的低效,因为我必须重新打开所有现有的连接。还请注意,仅仅在当前工作簿中这样做是不够的。必须在应用程序级别完成。如果到任何数据库的任何ADO连接仍然处于打开状态,我可以创建一个新的KDB+ ADO连接,但它仍然指向上一个实例

我查看了KDB+连接对象的错误属性,有两个错误:

  1. 多步OLE DB操作生成错误。如果可用,请检查每个OLE DB状态值。没有做任何工作。
  2. 提供程序不支持该属性。

这似乎被记录在http://support.microsoft.com/kb/269495中,但我无法在注册表中找到任何CLSID,因此无法对建议的更改进行实验。

如果打开ODBC日志记录,我会看到以下消息:

代码语言:javascript
运行
AI代码解释
复制
EXCEL                   8dc-22d0    EXIT  SQLGetInfoW  with return code -1 (SQL_ERROR)
    HDBC                0x02131EA8
    UWORD                      151 <SQL_KEYSET_CURSOR_ATTRIBUTES2>
    PTR                 0x003C4FB0
    SWORD                        4 
    SWORD *             0x00000000

    DIAG [S1096] [Microsoft][ODBC Driver Manager] Information type out of range (0) 

这会对错误负责吗?

一如既往,任何帮助和建议都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2014-10-08 08:16:16

您所看到的是驱动程序中的一个bug,您应该查找更多最新的驱动程序。

如果我没有亲自运行和测试代码,我不应该给出完整的答案(而不是注释),但是我建议您枚举连接对象的属性集合并查找连接池。

将连接池设置为0(或为false,取决于从查看属性值的变量类型中可以猜测到什么)是一种很有希望的解决方法。您的另一个选项是使用只转发的记录集:这可能有效,也可以不起作用,但值得一试。

注:几年前有一个开源项目,要编写一个适当的OLEDB驱动器,但这似乎已经从人们的视野中消失了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24587421

复制
相关文章
matlab在axis,matlab中axis的用法
>> axis([0 2*pi -0.9 0.9]) 图 5.1.3 使用了图形修饰的 plot 函数绘制的正弦曲线 5.1.3 图形的比较显示 在一般默认的情况下,MATLAB 每次使用 plot ……
全栈程序员站长
2022/09/06
2.1K0
在MATLAB中RSA加密
[Modulus, PublicExponent, PrivateExponent] = GenerateKeyPair;
万木逢春
2019/05/10
1.9K0
PS处理简单的视频剪切
视频是什么?视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、纪录、处理、储存、传送与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频。视频技术最早是为了电视系统而发展,但现在已经发展为各种不同的格式以利消费者将视频记录下来。网络技术的发达也促使视频的纪录片段以串流媒体的形式存在于因特网之上并可被电脑接收与播放。视频与电影属于不同的技术,后者是利用照相术将动态的影像捕捉为一系列的静态照片。
爱上歆随懿恫
2022/08/10
1.4K0
PS处理简单的视频剪切
eeglab在MATLAB中安装教程
1.在eeglab官网,如下图,在红框中有Download EEGLAB选项,点击该选项。
脑机接口社区
2020/06/29
2.1K0
unit在matlab中啥意思,unit8(matlab中uint8函数)
就是宏定义,代码中就用这些去定义变量 如uint16 a; 就表示定义了一个 无符号整形变量a (等价于 unsigned int a;)其他的同理 其作用是程序更加简洁 最大的作用是增.
全栈程序员站长
2022/09/30
1.5K0
FFMPEG音频视频开发: 命令行完成视频剪切与合成
一、环境介绍 操作系统介绍:win10 64位 FFMPEG版本: 4.4.2 QT版本: 5.12.6 二、操作命令 2.1 合成视频命令 ffmpeg.exe -f concat -i filelist.txt -c copy output.mp4 filelist.txt :存放合成视频的列表 列表格式例如: file '1_123.mp4' file '2_123.mp4' file '3_123.mp4' file '4_123.mp4' file '5_123.mp4' file '6_12
DS小龙哥
2022/01/12
5920
如何在 Vim 中复制,剪切,粘贴
Vim 以及它的前辈 Vi 在 macOS 和基本上所有的 Linux 版本上都预装了。在你喜欢的编辑器还没有安装的情况下,对 Vim 有一些基本了解是很有用处的。
雪梦科技
2020/05/11
41.5K0
如何在 Vim 中复制,剪切,粘贴
matlab 汽车振动,matlab在汽车振动分析
Matlab在振动分析中的应用刘迪辉2011-10-20大家学了游泳理论,现在我们借助MATLAB软件,来练习一下游泳!实际问题:客车的振动分析• 客车样车路试过程中却出现了令人意想不到的一系列振动问题 ,主要表现为 : (1) 汽车起动时发动机抖动厉害 ; (2) 当车速在 40 km/ h 左右时 ,整车有共振现象 ; (3) 当车速在 85 km/ h 左右时 ,整车有明显振动 ; (4) 当车速超过 118 km/ h 时 ,驾驶区及方向盘有强烈振感。• 由于上述振动的存在 ,一方面大大降低了该车驾乘的舒适性和运行中的安全性 ;另一方面 ,造成一些主要总成件 (如发动机、变速器、后桥等 ) 的早期损坏 ;同时 ,也使得汽车上很多结构件出现疲劳断裂 ,从而进一步加剧了整车或局部振动。• 选自王卫鸿 《 YBL6850C24aH》 型客车振动问题及解决方案,客车技术与研究, 2005.5Simulink Demo• This demo describes a simplified half-car model that includes an independent front and rear vertical suspension. 振动问题• 多自由度• 二自由度• 单自由度• 实际问题• ( 1)理论方法• ( 2) Matlab(实现理论算法)• (3) 有限元方法 Ansys, Abaqus, Natran等• ( 4) 试验方法难易• 建立力学模型、微分方程• 求解微分方程,得到响应特性振动方程时间 t响应函数 x(t)质量 m刚度 k阻尼 c时间 t激励函数 f(t)( 1) 已知激励函数和响应函数,求系统固有特性( 2) 已知固有特性,求在一定激励条件下的响应函数汽车悬架单自由度分析• 例 2.15 质量 m=2450kg的汽车,悬架总的刚度为 160000N/m, 减振器阻尼系数为 7135.6Ns/m,求该车辆受到 100 kg的简谐加载时的,车身的上下运动方程 .• 简谐激励首先得设定参数 F0, w, 和时间向量 t, 求每个时间的 f(t)理论公式该函数由普通微分方程求解方法其中提问:为什么要如此参数化?方便求解和定义联系起来固有频率 系统阻尼
全栈程序员站长
2022/11/03
7180
matlab 汽车振动,matlab在汽车振动分析
matlab是fmincon,matlab中fmincon
标签: fmincon| MATLAB非线性优化fmincon_数学_自然科学_专业资料。MATLAB非线性优化函数fmincon的详细整理 active-set and sqp algorithms 不接受用户提供的海塞矩阵……
全栈程序员站长
2022/08/12
2K0
python剪切文件
#剪切文件import os def shear_dile(src,dst): if os.path.isdir(src): if not os.listdir(src): os.rmdir(src) print('移除空目录: ' + src) else : for d in os.listdir(src): shear_dile(os.path.join(src
狼啸风云
2020/08/10
8510
在MATLAB中使用opencv
我们来说说第二类,需要做的事情是先编译opencv的源码、再编译matlab可用的mex文件夹,这两步的编译器必须是同一个,而最近几年的新版本matlab都推荐使用MinGW-w64编译器来使用mex、可是mexopencv提供的编译辅助函数在Windows系统上默认使用Visual Studio或者Windows SDK来编译,如果觉得自己需要Visual Studio的其他功能,安装一下也是挺好的
万木逢春
2019/10/09
6.3K0
在MATLAB中使用opencv
在python中运行MATLAB代码从而实现批量运算结果
在安装好python和matlab的电脑上,如果需要做一些流程化的内容,matlab这个方面不擅长,此时可以借助python来开发,
用户9925864
2023/09/05
6760
在python中运行MATLAB代码从而实现批量运算结果
FFmpeg优化 苏宁PP体育视频剪切效率提升技巧
苏宁旗下PP体育所在的直播行业,每天有无数视频原始数据需要进行分类存储、渲染处理。处理这些视频,一个很重要的方面,就是要将长时段的直播视频切割成不定时长,不定画面组的短视频,以匹配现代用户碎片化的消费时间。尤其是体育赛事直播行业,在直播前的垫场片花、直播中的即时快看、直播后的全场集锦和精华镜头,都需要对大量的视频作剪切/压制处理。而且因为体育赛事直播行业的特殊性,对于直播中和直播后的精彩镜头,集锦类视频片段,要求必须能及时处理视频,并发布到用户端。这对视频的处理效率提出了非常高的要求。
LiveVideoStack
2021/09/01
7920
信号与系统实验一 信号在MATLAB中的表示
 3.用下列函数各画一图,参数自定。 sinc,rectpuls,square,tripuls,sawtooth
timerring
2022/07/20
1.4K0
信号与系统实验一 信号在MATLAB中的表示
matlab中错误使用fmincon,MATLAB中fmincon 函数问题
[w,fval]=fmincon(@fun2,w0,[],[],Aeq,Beq,@myfuntestcon,options)
全栈程序员站长
2022/09/01
1K0
matlab中错误使用fmincon,MATLAB中fmincon 函数问题
Canvas 剪切图片
/** * 剪切图像 */ function initDemo8(){ var canvas = document.getElementById("demo8"); if (!canvas) return; var context = canvas.getContext("2d"); var img = new Image(); img.src = "images/timg3.jpg"; img.onload = function () {
就只是小茗
2018/03/07
2.1K0
matlab中的im2bw函数_matlab中tofloat
这种du格式将一张二值图像显示在屏zhi幕上, 允许用户使用鼠标在图像上点几个点, 这几个点围成的区域即要填充的区域。要以这种交互方式操作, BW必须是一个二维的图像。用户可以通过按Backspace键或者Delete键来取消之前选择的区域;通过shift+鼠标左键单击或者鼠标右键单击或双击可以确定选择区域。
全栈程序员站长
2022/09/30
1.2K0
matlab fopen fread_matlab中prctile函数
大家好,又见面了,我是你们的朋友全栈君。 matlab中length函数 length(x)在matlab中是什么意思?小编能记住你的一点一滴,你却忘了小编的一丝一毫。 if length(h)>1
全栈程序员站长
2022/09/30
1.4K0
matlab fopen fread_matlab中prctile函数
Matlab循环语句_matlab中if语句的用法
《matlab循环语句》由会员分享,可在线阅读,更多相关《matlab循环语句(9页珍藏版)》请在人人文库网上搜索。
全栈程序员站长
2022/11/10
3.1K0
点击加载更多

相似问题

在iPhone上剪切视频

14

在Reactjs上传前剪切视频

19

Matlab获取剪切量

11

在Ubuntu中用ffmpeg剪切视频

14

在MatLab中播放视频

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档