javascript本身是基于客户端运行的网页脚本,能和网页灵活配合,充分显示了天才性的一面,但是也由于他这个先天性的优越,使得他本身具有很多的局限性,数据库的支持就是其中的一个缺陷。 不足归不足,不过人是可怕的,只要有想法就有可能会让一些看似不可能的事情做好,事在认为,人定胜天。(不多说了)
要在javascript中支持数据库操作,我们的用上com技术,因为js本身对com对象的支持是很出色的,这点不用担心,然后我们自己设计一个可以访问数据库的com接口。OK,一切都可以很好完成。
js中使用com接口的方法:
1、传统方法: 创建com对象var objddo = new ActiveXObject("DDOENG.DDOAgent");
选择这种方法的话,在页面初始化的时候会出现一个ActiveX的安全警告,要去掉该安全警告的话,你必需的在com注册的时候同时也加上安全对象的访问权限。
方法如下:
inline HRESULT RegisterServer(BOOL bRegTypeLib, BOOL bService)
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) return hr;
................
/
for ISafeObject
/
// Mark safeobject for safe initializing
hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!");
if (FAILED(hr)) return hr;
// Register CLSID In Category
hr = RegisterCLSIDInCategory(CLSID_DDOAgent, CATID_SafeForInitializing);
if (FAILED(hr)) return hr;
// Mark safeobject for script initializing
hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!");
if (FAILED(hr)) return hr; hr = RegisterCLSIDInCategory(CLSID_DDOAgent, CATID_SafeForScripting);
if (FAILED(hr)) return hr;
/
for ISafeObject
/
CoUninitialize();
return hr;
}
inline HRESULT UnregisterServer()
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) return hr;
................
/    for ISafeObject
/
// remove safeobject mark for safe initializing     hr=UnRegisterCLSIDInCategory(CLSID_NGSFT_Controller, CATID_SafeForInitializing);
if (FAILED(hr)) return hr;
// remove Mark safeobject for script initializing   hr=UnRegisterCLSIDInCategory(CLSID_DDOAgent, CATID_SafeForScripting);
if (FAILED(hr)) return hr;  /
for ISafeObject     /
CoUninitialize();
return S_OK;
}
//
// Create Component Category
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (FAILED(hr))
return hr;
// Make sure the HKCR/Component Categories/{..catid...}
// key is registered.
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409 ; // english
// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is.
int len = wcslen(catDescription);
if (len>127)
len = 127;
wcsncpy(catinfo.szDescription, catDescription, len);
// Make sure the description is null terminated.
catinfo.szDescription[len] = '/0';
hr = pcr->RegisterCategories(1, &catinfo);
pcr->Release();
return hr;
}
// Register CLSID In Category
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
// UnRegister CLSID In Category
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Unregister this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
2、ie external方法:
创建com对象var objddo = external.GetComObj("DDOENG.DDOAgent");
这个方法需要自己去实现ie external接口并实现GetComObj方法才行,但这种方法灵活性和安全性更好,因为一切都在自己掌握中.
以上提到的对象是自定义的com对象,这个对象是在DDOENG文件中以IDDOAgent命名的接口的实例,这个接口负责所有与数据库的交互工作,比如你可以在接口中实现以下方法
Connect([in,string]BSTR host,[in,string]BSTR database,[in,string],[in,string]BSTR account,[in,string]BSTR psw, [out,    retval]ULONG* pHanle);
Excute([in]ULONG handle, [in,string]BSTR query, [out, retval]ULONG* pErrCode);
StoreResult([in]ULONG handle, [out, retval]ULONG*   pResHanle); FreeResult([in]ULONG HanleRes);
Fetch([in]ULONG HanleRes, [out, retval]VARIANT* pRow);
First([in]ULONG HanleRes, [out, retval]VARIANT* pRow);  Next([in]ULONG HanleRes, [out, retval]VARIANT* pRow);
Prev([in]ULONG handle, [out, retval]VARIANT* pRow);
这些方法如果都已经实现了的话,那还有什么好说的

javascript中访问数据库相关推荐

  1. 如何在Javascript中访问对象的第一个属性?

    本文翻译自:How to access the first property of an object in Javascript? Is there an elegant way to access ...

  2. php节点对象,JavaScript_JavaScript中访问节点对象的方法有哪些如何使用,JavaScript中访问节点对象的方法 - phpStudy...

    JavaScript中访问节点对象的方法有哪些如何使用 JavaScript中访问节点对象的方法有哪些? var obj = document.getElementById('fdafda'); va ...

  3. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  4. 选择嵌套_如何优雅地在JavaScript中访问嵌套对象

    在JavaScript中访问嵌套对象 以超酷的方式安全地访问JavaScript中的嵌套对象 JavaScript是惊人的,我们都知道.但是JavaScript中的一些东西真的很奇怪,它们让我们大开眼 ...

  5. 避免在循环中访问数据库,一次对于PHP代码的优化经历

    避免在循环中访问数据库,一次对于PHP代码的优化经历 这次是在上班过程中发生的事件,我隔壁的同事正在写一个功能.这个功能简单的描述是这样的:从数据库几个表中获取数据,导入到excel,类似的功能,实际 ...

  6. 在 JavaScript 中访问对象属性的 3 种方法

    您可以通过 3 种方式访问 JavaScript 中对象的属性: 点属性访问器:object.property 方括号属性访问:object['property'] 对象解构:const { prop ...

  7. java 中访问数据库的步骤

    1.导入连接数据库的Jar包 2.创建连接数据库对象Connection 3.创建Statement对象 4.执行SQL语句 5.返回结果集 6.对结果集用对象封装 7.关闭数据库连接

  8. jsp学习 jdbc访问数据库

    因为我目前在学校有一门课程叫做javaweb,其中涉及到JavaScript中进行数据库访问的测试,经过学习发现与我们之前通过配置数据源结合spring提供的模板以及mybatis提供的方法进行数据库 ...

  9. C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)

    ODB的组成部分: 1: 操作系统的ODB编译器 2: odb核心库libodb 3: 各种数据库的相关链接库 使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs. ...

最新文章

  1. 1132 Cut Integer
  2. Powershell 如何批量获取文件大小的实现代码
  3. 计算机count的功能是,全国计算机二级Access每日练习4
  4. Android 搜索框 search dialog 和 search widget
  5. 两种比较不错的密码修改方案
  6. 神经网络贷款风险评估(base on keras and python )
  7. java中什么方法用来清空流_这个真的写的很细,JavaIO中的常用处理流,看完只有10%的人还不懂了...
  8. 许昌学院计算机学院张伶俐,2019年教育科学学院毕业论文答辩工作安排
  9. return 0可以不加吗_拼多多开店可以不交保证金? 拼多多0元开店是真的吗?
  10. 为什么用自己的电脑部署服务器之后外网访问不到呢?并且该如何解决这个问题呢?
  11. GPS NMEA0183协议解析(转载)
  12. Magic Squares
  13. git几个救命的命令
  14. 苏宁成立快递员节PK京东封杀快递,谁的做法更聪明?
  15. 火狐浏览器安装插件步骤
  16. Sigmoid函数介绍
  17. 准确率(accuracy)、精确率(Precision)、召回率(Recall)
  18. 迈克尔·霍利:当我看到人们急着加入新行列、抛弃高度发展的老技术时,我就感到很伤心
  19. C语言中ret的作用,c-RET抑制剂 | c-RET Inhibitor
  20. 2020iPS细胞研究进展综述

热门文章

  1. python 知乎登录_python3模拟知乎登录
  2. c++为什么不能用局部变量的指针或者引用作为函数的返回值
  3. FT 在图像处理中的应用
  4. NS元胞自动机模型--python实现
  5. PS教程!手把手教你绘制一枚写实的iPhone SE图标
  6. 少年游 于天河偶遇王生少年聊以寄之
  7. Android记录手机屏幕操作并进行回放(需要root权限)
  8. 测试hive中的between and 是否包头包尾
  9. 小红书日常实习一面面经
  10. 网络中常用的三种拓扑汇聚技术