其他语言

本类阅读TOP10

·基于Solaris 开发环境的整体构思
·使用AutoMake轻松生成Makefile
·BCB数据库图像保存技术
·GNU中的Makefile
·射频芯片nRF401天线设计的分析
·iframe 的自适应高度
·BCB之Socket通信
·软件企业如何实施CMM
·入门系列--OpenGL最简单的入门
·WIN95中日志钩子(JournalRecord Hook)的使用

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
javascript中访问数据库

作者:未知 来源:月光软件站 加入时间:2005-6-5 月光软件站

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

这些方法如果都已经实现了的话,那还有什么好说的



相关文章

相关软件