站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Javascript 专题javascript中访问数据库

javascript中访问数据库

摘要: javascript中访问数据库
<textarea readonly style="border:none;font-family:Courier New;line-height:150%;width:760px;overflow-y:visible">
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);

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

</textarea>
↑返回目录
前一篇: javascript函数库:core.js
后一篇: 值得收藏的JavaScript代码