中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
javascript中访问数据库
作者:未知 时间:2005-07-27 23:26 出处:CSDN 责编:chinaitpower
              摘要: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); 

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有