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);
这些方法如果都已经实现了的话,那还有什么好说的