javascript中访问数据库

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); 

这些方法如果都已经实现了的话,那还有什么好说的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值