以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  高级功能研发区  (http://www.weistock.com/bbs/list.asp?boardid=5)
----  请教DLL读取数据库表格的问题  (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&id=96602)

--  作者:智慧梦
--  发布时间:2016/4/22 10:56:52
--  请教DLL读取数据库表格的问题

问题描述:

编制一个DLL,其功能是:ODBC或者ADO打开一个Foxpro的数据表DBF, 读取我自己的生成的数据。

在行情总表(序列方式下?)这个DLL被频繁调用。每个股票调用一次, 建立数据连接,SQL访问,返回数据..调用完毕,关闭数据连接.下次再调用,再建立链接,,再关闭链接..时间都废在建立链接这里了.

请教:能否一次链接多次访问呢?如何加快提高访问效率?

谢谢!


--  作者:王锋
--  发布时间:2016/4/22 11:11:51
--  

勾选这里选项。

然后你的DLL应该在初始化的位置将数据库的建立连接部分放到公共的全局部分,软件调用接口后直接就只去调用具体数据就可以了,这样速度就加快了


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20160422110820.gif
图片点击可在新窗口打开查看

--  作者:onlyflyttn
--  发布时间:2016/4/26 18:42:30
--  
请问金字塔的VBA不是可以直接调用ADO进行数据访问么,Dll有什么优势?
--  作者:智慧梦
--  发布时间:2016/5/8 12:02:44
--  
以下是引用智慧梦在2016/4/22 10:56:52的发言:

问题描述:

编制一个DLL,其功能是:ODBC或者ADO打开一个Foxpro的数据表DBF, 读取我自己的生成的数据。

在行情总表(序列方式下?)这个DLL被频繁调用。每个股票调用一次, 建立数据连接,SQL访问,返回数据..调用完毕,关闭数据连接.下次再调用,再建立链接,,再关闭链接..时间都废在建立链接这里了.

请教:能否一次链接多次访问呢?如何加快提高访问效率?

谢谢!

 

王峰专家您好:

      按照您的指引,我做了尝试,暂时还未有结果.因为中途被卡住了(我使用ADO). 源码如下,请专家指点为盼,谢谢!

 

hr=m_pConnection.CreateInstance("ADODB.Connection") ;       // 创建Connection对象
if(SUCCEEDED(hr))
  {

 

_bstr_t strConnect=

     "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=c:\\\\JZTTEST\\\\;Exclusive=No;Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";

 

m_pConnection->Open(strConnect,"","",adModeUnknown);       /* 金字塔调用时,就卡死在这里...而做成一般EXE程序时,就正常运行读取数据*/

 

 

  }

 

     

[此贴子已经被作者于2016/5/8 12:04:09编辑过]

--  作者:智慧梦
--  发布时间:2016/5/8 12:18:35
--  王峰专家,源码在此,请赐教为盼,谢谢!
以下是引用智慧梦在2016/4/22 10:56:52的发言:

问题描述:

编制一个DLL,其功能是:ODBC或者ADO打开一个Foxpro的数据表DBF, 读取我自己的生成的数据。

在行情总表(序列方式下?)这个DLL被频繁调用。每个股票调用一次, 建立数据连接,SQL访问,返回数据..调用完毕,关闭数据连接.下次再调用,再建立链接,,再关闭链接..时间都废在建立链接这里了.

请教:能否一次链接多次访问呢?如何加快提高访问效率?

谢谢!

王峰专家您好:

      按照您的指引,我做了尝试,暂时还未有结果.因为中途被卡住了(我使用ADO). 源码如下,请专家指点为盼,谢谢!

 

........
_RecordsetPtr  m_pRecordset("ADODB.Recordset");
_ConnectionPtr m_pConnection("ADODB.Connection");
........


//以上是定义,,以下是DLLMain程序
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
//::CoInitialize(NULL);
try
  {
    hr=m_pConnection.CreateInstance("ADODB.Connection");
    if(SUCCEEDED(hr))
        {
          _bstr_t strC;
          m_pConnection->Open(strConnect,"","",adModeUnknown);       /*为什么死在这里*/
          mylog<<"死在上一句,为什么到不了这里???"<<endl;

        }
   }
catch(_com_error e) 
  { 
   mylog<<"这个错误信息是什么都显示不出来?"<<e.ErrorMessage()<<endl;
   return TRUE; 
  } 
 
m_pRecordset.CreateInstance(__uuidof(Recordset));// 创建记录集对象

switch (ul_reason_for_call) {
   case DLL_PROCESS_ATTACH:
        ::CoInitialize(NULL);
   case DLL_THREAD_ATTACH:
   case DLL_THREAD_DETACH:
   case DLL_PROCESS_DETACH:
        ::CoUninitialize();
      break;
  }

if(m_pConnection->State) 
    m_pConnection->Close();
//::CoUninitialize();

return TRUE;
}


--  作者:马良
--  发布时间:2016/5/8 13:04:28
--  
你用的是什么数据库?试试换成access看看能否正常调用。
--  作者:智慧梦
--  发布时间:2016/5/9 12:18:55
--  
以下是引用马良在2016/5/8 13:04:28的发言:
你用的是什么数据库?试试换成access看看能否正常调用。

还没到链接数据库这一步,就死掉了,死在"创建Connection对象"这一步就死掉了

但是我做成EXE文件就正常.

 

hr=m_pConnection.CreateInstance("ADODB.Connection") ;       // 创建Connection对象-------在这一步就死掉了


--  作者:王锋
--  发布时间:2016/5/9 13:32:40
--  
那应该与金字塔无关的,是不是你的在项目中还有其他什么东西,导致冲突了
--  作者:智慧梦
--  发布时间:2016/5/9 20:58:06
--  
以下是引用王锋在2016/5/9 13:32:40的发言:
那应该与金字塔无关的,是不是你的在项目中还有其他什么东西,导致冲突了

 

以下是网上的案例,与我一样.他的解决方法就是:首先在调用的EXE程序(也就是金字塔程序)里先初始化,奇怪就可以了

 

http://bbs.csdn.net/topics/340181461

 


--  作者:智慧梦
--  发布时间:2016/5/10 11:39:20
--  
以下是引用王锋在2016/5/9 13:32:40的发言:
那应该与金字塔无关的,是不是你的在项目中还有其他什么东西,导致冲突了

 

王峰等专家: 请问,有无现成的使用ADO的DLL源码实例,我来学习一下,拜托了.