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); 这些方法如果都已经实现了的话,那还有什么好说的
本文地址:http://com.8s8s.com/it/it21891.htm