javascript中访问数据库

原创 2005年05月23日 13:19:00
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访问数据库

JS操作 Access 数据库 Js代码   "JavaScript">   var filePath = location.href.substring(0, loca...

实例:在 javascript 中访问数据库方法

实际开发中,经常需要在Javascript中访问数据库,以取得较好的性能和用户体验。下面以实际例子给经说明,测试时,请将数据库名改为你的数据库名。(以Access为例).  html> hea...

javascript实现连接数据库

javascript实现连接数据库 View Code head> title>表格显示数据表记录title> head> body> h2>表格显示数据表记录h2> hr> s...

javascript原生移动云编程9 - 如何使用云数据库读取和保存数据

用javascript在码实云平台上,可以在云里编写原生的移动应用。移动应用必然要和数据库打交道。码实平台提供了全面的云服务,也包括了数据库的部分。云编程可以方便地用javascript对数据进行操作...
  • mash5
  • mash5
  • 2014年09月11日 06:44
  • 1172

JAVASCRIPT 数据库 静态连接

  • 2011年09月01日 17:15
  • 10KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:javascript中访问数据库
举报原因:
原因补充:

(最多只允许输入30个字)