// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// add by myself
#include <oledb.h>
#include <oledberr.h>
#include <msdaguid.h>
#include <msdasc.h>
#include <msdaguid.h>
#include <msdasql.h>
// TODO: 在此处引用程序需要的其他头文件
// ------------------------------------------------------------------------------------
// LrnOleDb.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#define ROUNDUP_AMOUNT 8
#define ROUNDUP_(size,amount) (((ULONG)(size)+((amount)-1))&~((amount)-1))
#define ROUNDUP(size) ROUNDUP_(size, ROUNDUP_AMOUNT)
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
// -------------------
IDataInitialize* pIDataInitialize=NULL;
HRESULT hr=CoCreateInstance(CLSID_MSDAINITIALIZE,NULL,CLSCTX_INPROC_SERVER,IID_IDataInitialize,(void**)&pIDataInitialize);
if(FAILED(hr)){
printf("Can not create IDataInitialize Interface!\n");
return -1;
}
IDBInitialize* pIDBInitialize=NULL;
CLSID clsid;
hr=CLSIDFromProgID(L"SQLOLEDB",&clsid);
if(FAILED(hr))
return -1;
hr=pIDataInitialize->CreateDBInstance(clsid,NULL,CLSCTX_INPROC_SERVER,NULL,IID_IDBInitialize,(IUnknown**)&pIDBInitialize);
if(FAILED(hr)){
printf("Can not create IDBInitialize interface!\n");
pIDataInitialize->Release();
return -1;
}
//pIDataInitialize->Release();
IDBProperties* pIDBProperties=NULL;
DBPROP initProp[4];
DBPROPSET initPropSet[1];
for(int i=0;i<4;i++){
VariantInit(&initProp[i].vValue);
initProp[i].colid=DB_NULLID;
initProp[i].dwOptions=DBPROPOPTIONS_REQUIRED;
}
initProp[0].dwPropertyID=DBPROP_INIT_DATASOURCE;
//initProp[0].dwOptions=DBPROPOPTIONS_REQUIRED;
initProp[0].vValue.vt=VT_BSTR;
initProp[0].vValue.bstrVal=SysAllocString(OLESTR("local"));
//initProp[0].colid=DB_NULLID;
//initProp[1].colid=DB_NULLID;
//initProp[1].dwOptions=DBPROPOPTIONS_REQUIRED;
initProp[1].dwPropertyID=DBPROP_INIT_CATALOG;
initProp[1].vValue.vt=VT_BSTR;
initProp[1].vValue.bstrVal=SysAllocString(OLESTR("Northwind"));
//initProp[2].colid=DB_NULLID;
//initProp[2].dwOptions=DBPROPOPTIONS_REQUIRED;
initProp[2].dwPropertyID=DBPROP_AUTH_INTEGRATED;
initProp[2].vValue.vt=VT_BSTR;
initProp[2].vValue.bstrVal=SysAllocString(OLESTR("SSPI"));
initPropSet[0].cProperties=4;
initPropSet[0].guidPropertySet=DBPROPSET_DBINIT;
initPropSet[0].rgProperties=initProp;
hr=pIDBInitialize->QueryInterface(IID_IDBProperties,(void**)&pIDBProperties);
if(FAILED(hr)){
printf("Can not query interface IDBProperties!\n");
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
//pIDataInitialize->Release();
return -1;
}
// 下面这条语句执行返回码为DB_E_ERRORSOCCURRED
// 查看帮助得:
// All property values were invalid and no properties were set. The consumer checks dwStatus in the DBPROP
// structures to determine why properties were not set. The method can fail to set properties for any of the
// reasons specified in DB_S_ERRORSOCCURRED.
// 所有属性变量无效,并且任何属性都没有被设置!其原因可能多样(大致此意)
hr=pIDBProperties->SetProperties(1,initPropSet);
if(FAILED(hr)){
printf("Can not SetProperties!\n");
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
//pIDataInitialize->Release();
return -1;
}
pIDBProperties->Release();
hr=pIDBInitialize->Initialize();
IDBCreateSession* pIDBCreateSession=NULL;
hr=pIDBInitialize->QueryInterface(IID_IDBCreateSession,(void**)&pIDBCreateSession);
if(FAILED(hr)){
printf("Can not find IDBCreateSession interface!\n");
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
//pIDataInitialize->Release();
return -1;
}
//IOpenRowset* pIOpenRowset=NULL;
//ISessionProperties* pISessionProperties=NULL;
//hr=pIDBCreateSession->CreateSession(NULL,IID_IOpenRowset,(IUnknown**)&pIOpenRowset);
//if(FAILED(hr)){
// printf("Can not Create session!\n");
// pIDBCreateSession->Release();
// pIDBInitialize->Release();
// return -1;
//}
//hr=pIDBCreateSession->CreateSession(NULL,IID_ISessionProperties,(IUnknown**)&pISessionProperties);
//if(FAILED(hr)){
// printf("Can not Create session!\n");
// pIDBCreateSession->Release();
// pIDBInitialize->Release();
// return -1;
//}
//pIDBCreateSession->Release();
//ISessionProperties* pISessionProperties=NULL;
//hr=pIOpenRowset->QueryInterface(IID_ISessionProperties,(void**)&pISessionProperties);
//if(FAILED(hr)){
// printf("Query ISessionProperties interface failure!\n");
// pIOpenRowset->Release();
// pIDBInitialize->Release();
// return -1;
//}
//DBPROP sessionProp[1];
//DBPROPSET sessionPropSet[1];
//VariantInit(&sessionProp[0].vValue);
//sessionProp[0].colid=DB_NULLID;
//sessionProp[0].dwOptions=DBPROPOPTIONS_REQUIRED;
//sessionProp[0].dwPropertyID=DBPROP_SESS_AUTOCOMMITISOLEVELS;
//sessionProp[0].vValue.vt=VT_I4;
//sessionProp[0].vValue.lVal=DBPROPVAL_TI_READCOMMITTED;
//sessionPropSet[0].cProperties=1;
//sessionPropSet[0].guidPropertySet=DBPROPSET_SESSION;
//sessionPropSet[0].rgProperties=sessionProp;
//hr=pISessionProperties->SetProperties(1,sessionPropSet);
//if(FAILED(hr)){
// printf("Can not set session properties!\n");
// pISessionProperties->Release();
// //pIOpenRowset->Release();
// pIDBInitialize->Release();
// return -1;
//}
//pISessionProperties->Release();
IDBCreateCommand* pIDBCreateCommand=NULL;
hr=pIDBCreateSession->CreateSession(NULL,IID_IDBCreateCommand,(IUnknown**)&pIDBCreateCommand);
if(FAILED(hr)){
printf("Cant create session IDBCreateCommand!\n");
pIDBCreateSession->Release();
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
return -1;
}
pIDBCreateSession->Release();
ICommandText* pICommandText=NULL;
hr=pIDBCreateCommand->CreateCommand(NULL,IID_ICommandText,(IUnknown**)&pICommandText);
if(FAILED(hr)){
printf("Can not create command ICommandText!\n");
pIDBCreateCommand->Release();
pIDBCreateSession->Release();
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
return -1;
}
pIDBCreateCommand->Release();
pIDBCreateSession->Release();
hr=pICommandText->SetCommandText(DBGUID_DEFAULT, L"SELECT EmployeeID, LastName, FirstName, Title, TitleOfCourtesy, BirthData, HireData, Address, City, Region, PostalCode, Country, HomePhone, Extension FROM Employees");
if(FAILED(hr)){
printf("Can't set command text!\n");
pICommandText->Release();
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
return -1;
}
IRowset* pIRowset=NULL;
hr=pICommandText->Execute(NULL,IID_IRowset, NULL, NULL, (IUnknown**)&pIRowset);
if(FAILED(hr)){
printf("Execute command failure!\n");
pICommandText->Release();
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
return -1;
}
pICommandText->Release();
IColumnsInfo* pIColumnsInfo=NULL;
hr=pIRowset->QueryInterface(IID_IColumnsInfo, (void**)pIColumnsInfo);
if(FAILED(hr)){
printf("Query interface IColumnsInfo failure!\n");
pIRowset->Release();
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
return -1;
}
DBORDINAL ncColumns=0;
DBCOLUMNINFO* rgColumnInfo=NULL;
LPWSTR pStringBuffer=NULL;
hr=pIColumnsInfo->GetColumnInfo(&ncColumns,&rgColumnInfo,&pStringBuffer);
if(FAILED(hr)){
pIColumnsInfo->Release();
pIRowset->Release();
pIDBInitialize->Uninitialize();
pIDBInitialize->Release();
return -1;
}
DBBINDING* rgBindings=NULL;
ULONG dwOffset=0;
rgBindings=(DBBINDING*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ncColumns*sizeof(DBBINDING));
for(ULONG l=0;l<ncColumns;l++){
rgBindings[l].iOrdinal=rgColumnInfo[l].iOrdinal;
rgBindings[l].dwPart=DBPART_VALUE|DBPART_LENGTH|DBPART_STATUS;
rgBindings[l].obStatus=dwOffset;
rgBindings[l].obLength=dwOffset+sizeof(DBSTATUS);
rgBindings[l].obValue=dwOffset+sizeof(DBSTATUS)+sizeof(ULONG);
rgBindings[l].dwMemOwner=DBMEMOWNER_CLIENTOWNED;
rgBindings[l].eParamIO=DBPARAMIO_NOTPARAM;
rgBindings[l].bPrecision=rgColumnInfo[l].bPrecision;
rgBindings[l].bScale=rgColumnInfo[l].bScale;
rgBindings[l].wType=rgColumnInfo[l].wType;
rgBindings[l].cbMaxLen=rgColumnInfo[l].ulColumnSize;
dwOffset=rgBindings[l].cbMaxLen+rgBindings[l].obValue;
dwOffset=ROUNDUP(dwOffset);
}
IAccessor* pIAccessor=NULL;
hr=pIRowset->QueryInterface(IID_IAccessor,(void**)&pIAccessor);
if(FAILED(hr)){
printf("Create Accessor failure!\n");
pIRowset->Release();
pICommandText->Release();
HeapFree(GetProcessHeap(),ncColumns*sizeof(DBBINDING),rgBindings);
CoTaskMemFree(rgColumnInfo);
CoTaskMemFree(pStringBuffer);
return -1;
}
HACCESSOR* phAccessor;
hr=pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA,ncColumns,rgBindings,0,phAccessor,NULL);
pIAccessor->Release();
pIRowset->Release();
pICommandText->Release();
//hr=pIDBCreateSession->CreateSession(NULL,IID_ICommandText,(IUnknown**)&pICommandText);
//if(FAILED(hr)){
// printf("Can not query interface ICommandText!\n");
// pIDBCreateSession->Release();
// pIDBInitialize->Release();
// return -1;
//}
// -------------------
CoUninitialize();
return 0;
}
6 个解决方案
#1
Step by step procedure
Reference ADODB in your project. This is required to read the COM object passed back from DataLinks. This file is located here: c:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll
Reference DataLinks in your project. DataLinks used to be MSDASC.dll, but has changed to OLEDB32.DLL (see KB). This file is located here: C:\Program Files\Common Files\System\Ole DB\OLEDB32.DLL
Create a text box and a button on a Windows Form. In the button's click event, use this code:
Reference ADODB in your project. This is required to read the COM object passed back from DataLinks. This file is located here: c:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll
Reference DataLinks in your project. DataLinks used to be MSDASC.dll, but has changed to OLEDB32.DLL (see KB). This file is located here: C:\Program Files\Common Files\System\Ole DB\OLEDB32.DLL
Create a text box and a button on a Windows Form. In the button's click event, use this code:
private void ButtonGetConnectionString_Click(object sender,
System.EventArgs e)
{
/*
Reference DataLinks
NOTE: Reference
C:\Program Files\Common Files\System\Ole DB\OLEDB32.DLL
(Was MSDASC.dll)
SEE:
http://support.microsoft.com:80/support/kb/articles/Q225/1/32.asp
*/
MSDASC.DataLinks dataLinks = new MSDASC.DataLinksClass();
//note that a reference to:
// c:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll
//is also required to read the ADODB._Connection result
ADODB._Connection connection;
//are we editing an existing connect string or getting a new one?
if(this.txtConnectionString.Text==String.Empty)
{
// get a new connection string
try
{
//Prompt user for new connect string
connection = (ADODB._Connection)dataLinks.PromptNew();
//read result
this.txtConnectionString.Text=
connection.ConnectionString.ToString();
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
else
{
// edit connection string
connection=new ADODB.ConnectionClass();
connection.ConnectionString=this.txtConnectionString.Text;
//set local COM compatible data type
object oConnection=connection;
try
{
//prompt user to edit the given connect string
if((bool)dataLinks.PromptEdit(ref oConnection))
{
this.txtConnectionString.Text=
connection.ConnectionString;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
#2
LS的C#代码很帅气
#3
呵呵,这个是vc的
程序编译环境:VC6, MDAC 2.1 ( ADO 2.1 ), Win9x / NT
介绍 Introduction
我最近在我的使用ADO应用程序中需要容许用户能够根据自己的需要配置一个连接串。搜索了最近的文档之后,发现没有任何关于怎样实现这个的信息。除了当从MDAC2.0到2.1过渡时,知识库中文章(Q225132)描述了一个使用#import声明的问题。这个刺激了我来写一篇文章来演示如何使你在你的应用程序中使用OLE DB的数据连接属性对话框。
这个数据连接对话框包含在OLEDB32.DLL(在MDAC2.1,MDAC2.1中在MSDASC.DLL)。他已经非常容易使用了。通过创建一个IdataSourceLocator接口实例,你就可以弹出这个对话框,并且快速的配置ADO数据源。
好了,让我们来看一看怎样实现他呢?我已经创建了一个简单的控制台程序工程,来演示如何做到这一点,在文章末,可以通过连接下载这个工程文件。
输入类型库 Importing the type libraries
首先,装入工程并打开一个源文件(datalink.cpp)。在这个源文件中,我已经很好的注释了其中的语句,因此你可以很容易的读懂它。但是那儿仍有些关键的点。
#import "c:\program files\common files\system\ado"
"\msado20.tlb" no_namespace rename("EOF", "IsEOF")
rename("BOF", "IsBOF")
#import "c:\program files\common files\system\ole "
db\oledb32.dll" rename_namespace("oledb")
头文件顶端的#import声明语句将告诉编译器生成一些文件,以使得我们使用数据连接和ADO对象的智能指针。这些输入声明语句也容许我们使用ADO对象,最重要的是对于本文所说的数据连接属性对话框。
显示数据连接属性对话框 Displaying the Data Link Properties Dialog
main()函数包含了一些代码,这些代码的作用是让我们装入或者保存一个预定义的连接字符串。我假定你已经对于IO类很熟悉了,因此我将略过这个部分,这部分只是演示给你在显示这个数据连接属性对话框时使用预定义的连接字符串。
例如,如下的代码段告诉你怎样显示这个对话框,来创建一个新的连接字符串(错误检查已经被移除)
oledb::IDataSourceLocatorPtr p_IDSL = NULL;
_ConnectionPtr p_conn = NULL;
p_IDSL.CreateInstance( __uuidof( oledb::DataLinks ));
p_conn = p_IDSL->PromptNew();
PromptNew函数的功能就是显示一个新的要求用户健入所有参数的对话框,在返回时,p_conn即可以是NULL,这是当用户点击了取消按钮,也可以是包含一个创建好的连接(Connection)对象,根据用户的选择,这个对象的数据成员ConnectionString被设定为ADO的连接字符串。
要显示一个基于已经存在的连接串,这个有点令人费解。下面是一个例子。
oledb::IDataSourceLocatorPtr p_IDSL = NULL;
_ConnectionPtr p_conn = NULL;
p_IDSL.CreateInstance( __uuidof( oledb::DataLinks ));
p_conn.CreateInstance( "ADODB.Connection" );
p_conn->ConnectionString = _bstr_t("your connection string");
IDispatch * p_Dispatch = NULL;
p_conn.QueryInterface( IID_IDispatch, (LPVOID*) & p_Dispatch );
p_IDSL->PromptEdit( &p_Dispatch );
p_Dispatch->Release();
可以编辑的版本需要另外的一些步骤。第一,你需要创建一个连接对象(Connection Object)并设定它的连接串,然后使用QueryInterface转化成一个IDispatch指针,最后传递到PromptEdit函数。
PromptEdit返回一个BOOL值,如果用户点击OK,那么返回TRUE,否则返回FALSE。如果是TRUE的话,p_conn对象的ConnectionString属性将被设定为新的用户定义的连接参数。
程序编译环境:VC6, MDAC 2.1 ( ADO 2.1 ), Win9x / NT
介绍 Introduction
我最近在我的使用ADO应用程序中需要容许用户能够根据自己的需要配置一个连接串。搜索了最近的文档之后,发现没有任何关于怎样实现这个的信息。除了当从MDAC2.0到2.1过渡时,知识库中文章(Q225132)描述了一个使用#import声明的问题。这个刺激了我来写一篇文章来演示如何使你在你的应用程序中使用OLE DB的数据连接属性对话框。
这个数据连接对话框包含在OLEDB32.DLL(在MDAC2.1,MDAC2.1中在MSDASC.DLL)。他已经非常容易使用了。通过创建一个IdataSourceLocator接口实例,你就可以弹出这个对话框,并且快速的配置ADO数据源。
好了,让我们来看一看怎样实现他呢?我已经创建了一个简单的控制台程序工程,来演示如何做到这一点,在文章末,可以通过连接下载这个工程文件。
输入类型库 Importing the type libraries
首先,装入工程并打开一个源文件(datalink.cpp)。在这个源文件中,我已经很好的注释了其中的语句,因此你可以很容易的读懂它。但是那儿仍有些关键的点。
#import "c:\program files\common files\system\ado"
"\msado20.tlb" no_namespace rename("EOF", "IsEOF")
rename("BOF", "IsBOF")
#import "c:\program files\common files\system\ole "
db\oledb32.dll" rename_namespace("oledb")
头文件顶端的#import声明语句将告诉编译器生成一些文件,以使得我们使用数据连接和ADO对象的智能指针。这些输入声明语句也容许我们使用ADO对象,最重要的是对于本文所说的数据连接属性对话框。
显示数据连接属性对话框 Displaying the Data Link Properties Dialog
main()函数包含了一些代码,这些代码的作用是让我们装入或者保存一个预定义的连接字符串。我假定你已经对于IO类很熟悉了,因此我将略过这个部分,这部分只是演示给你在显示这个数据连接属性对话框时使用预定义的连接字符串。
例如,如下的代码段告诉你怎样显示这个对话框,来创建一个新的连接字符串(错误检查已经被移除)
oledb::IDataSourceLocatorPtr p_IDSL = NULL;
_ConnectionPtr p_conn = NULL;
p_IDSL.CreateInstance( __uuidof( oledb::DataLinks ));
p_conn = p_IDSL->PromptNew();
PromptNew函数的功能就是显示一个新的要求用户健入所有参数的对话框,在返回时,p_conn即可以是NULL,这是当用户点击了取消按钮,也可以是包含一个创建好的连接(Connection)对象,根据用户的选择,这个对象的数据成员ConnectionString被设定为ADO的连接字符串。
要显示一个基于已经存在的连接串,这个有点令人费解。下面是一个例子。
oledb::IDataSourceLocatorPtr p_IDSL = NULL;
_ConnectionPtr p_conn = NULL;
p_IDSL.CreateInstance( __uuidof( oledb::DataLinks ));
p_conn.CreateInstance( "ADODB.Connection" );
p_conn->ConnectionString = _bstr_t("your connection string");
IDispatch * p_Dispatch = NULL;
p_conn.QueryInterface( IID_IDispatch, (LPVOID*) & p_Dispatch );
p_IDSL->PromptEdit( &p_Dispatch );
p_Dispatch->Release();
可以编辑的版本需要另外的一些步骤。第一,你需要创建一个连接对象(Connection Object)并设定它的连接串,然后使用QueryInterface转化成一个IDispatch指针,最后传递到PromptEdit函数。
PromptEdit返回一个BOOL值,如果用户点击OK,那么返回TRUE,否则返回FALSE。如果是TRUE的话,p_conn对象的ConnectionString属性将被设定为新的用户定义的连接参数。
#4
根本没搞清LZ问什么。
可建立一个 .UDL 文件测试OLE DB的链接属性。
例子(连SQL Server的):
[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=server01;Auto Translate=False;Application Name=mydb
用文本编辑器录入以上内容(代换成你需要的),保存成.udl文件,双击。然后根据需要定制内容。
程序中直接用此文件链接数据库,例如:
strConnection = _T("File Name="+strAppPath+"\\mydb.udl;");
可建立一个 .UDL 文件测试OLE DB的链接属性。
例子(连SQL Server的):
[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=server01;Auto Translate=False;Application Name=mydb
用文本编辑器录入以上内容(代换成你需要的),保存成.udl文件,双击。然后根据需要定制内容。
程序中直接用此文件链接数据库,例如:
strConnection = _T("File Name="+strAppPath+"\\mydb.udl;");
#5
谢谢楼上的几位回复!我说的是OLEDB的连接!几位可能用的是ADO(比OLEDB要高一层,可效率要低一些)!
#6
参考http://gamebabyrocksun.blog.163.com/blog/static/571534632008101083957499/
#1
Step by step procedure
Reference ADODB in your project. This is required to read the COM object passed back from DataLinks. This file is located here: c:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll
Reference DataLinks in your project. DataLinks used to be MSDASC.dll, but has changed to OLEDB32.DLL (see KB). This file is located here: C:\Program Files\Common Files\System\Ole DB\OLEDB32.DLL
Create a text box and a button on a Windows Form. In the button's click event, use this code:
Reference ADODB in your project. This is required to read the COM object passed back from DataLinks. This file is located here: c:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll
Reference DataLinks in your project. DataLinks used to be MSDASC.dll, but has changed to OLEDB32.DLL (see KB). This file is located here: C:\Program Files\Common Files\System\Ole DB\OLEDB32.DLL
Create a text box and a button on a Windows Form. In the button's click event, use this code:
private void ButtonGetConnectionString_Click(object sender,
System.EventArgs e)
{
/*
Reference DataLinks
NOTE: Reference
C:\Program Files\Common Files\System\Ole DB\OLEDB32.DLL
(Was MSDASC.dll)
SEE:
http://support.microsoft.com:80/support/kb/articles/Q225/1/32.asp
*/
MSDASC.DataLinks dataLinks = new MSDASC.DataLinksClass();
//note that a reference to:
// c:\Program Files\Microsoft.NET\Primary Interop Assemblies\adodb.dll
//is also required to read the ADODB._Connection result
ADODB._Connection connection;
//are we editing an existing connect string or getting a new one?
if(this.txtConnectionString.Text==String.Empty)
{
// get a new connection string
try
{
//Prompt user for new connect string
connection = (ADODB._Connection)dataLinks.PromptNew();
//read result
this.txtConnectionString.Text=
connection.ConnectionString.ToString();
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
else
{
// edit connection string
connection=new ADODB.ConnectionClass();
connection.ConnectionString=this.txtConnectionString.Text;
//set local COM compatible data type
object oConnection=connection;
try
{
//prompt user to edit the given connect string
if((bool)dataLinks.PromptEdit(ref oConnection))
{
this.txtConnectionString.Text=
connection.ConnectionString;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
#2
LS的C#代码很帅气
#3
呵呵,这个是vc的
程序编译环境:VC6, MDAC 2.1 ( ADO 2.1 ), Win9x / NT
介绍 Introduction
我最近在我的使用ADO应用程序中需要容许用户能够根据自己的需要配置一个连接串。搜索了最近的文档之后,发现没有任何关于怎样实现这个的信息。除了当从MDAC2.0到2.1过渡时,知识库中文章(Q225132)描述了一个使用#import声明的问题。这个刺激了我来写一篇文章来演示如何使你在你的应用程序中使用OLE DB的数据连接属性对话框。
这个数据连接对话框包含在OLEDB32.DLL(在MDAC2.1,MDAC2.1中在MSDASC.DLL)。他已经非常容易使用了。通过创建一个IdataSourceLocator接口实例,你就可以弹出这个对话框,并且快速的配置ADO数据源。
好了,让我们来看一看怎样实现他呢?我已经创建了一个简单的控制台程序工程,来演示如何做到这一点,在文章末,可以通过连接下载这个工程文件。
输入类型库 Importing the type libraries
首先,装入工程并打开一个源文件(datalink.cpp)。在这个源文件中,我已经很好的注释了其中的语句,因此你可以很容易的读懂它。但是那儿仍有些关键的点。
#import "c:\program files\common files\system\ado"
"\msado20.tlb" no_namespace rename("EOF", "IsEOF")
rename("BOF", "IsBOF")
#import "c:\program files\common files\system\ole "
db\oledb32.dll" rename_namespace("oledb")
头文件顶端的#import声明语句将告诉编译器生成一些文件,以使得我们使用数据连接和ADO对象的智能指针。这些输入声明语句也容许我们使用ADO对象,最重要的是对于本文所说的数据连接属性对话框。
显示数据连接属性对话框 Displaying the Data Link Properties Dialog
main()函数包含了一些代码,这些代码的作用是让我们装入或者保存一个预定义的连接字符串。我假定你已经对于IO类很熟悉了,因此我将略过这个部分,这部分只是演示给你在显示这个数据连接属性对话框时使用预定义的连接字符串。
例如,如下的代码段告诉你怎样显示这个对话框,来创建一个新的连接字符串(错误检查已经被移除)
oledb::IDataSourceLocatorPtr p_IDSL = NULL;
_ConnectionPtr p_conn = NULL;
p_IDSL.CreateInstance( __uuidof( oledb::DataLinks ));
p_conn = p_IDSL->PromptNew();
PromptNew函数的功能就是显示一个新的要求用户健入所有参数的对话框,在返回时,p_conn即可以是NULL,这是当用户点击了取消按钮,也可以是包含一个创建好的连接(Connection)对象,根据用户的选择,这个对象的数据成员ConnectionString被设定为ADO的连接字符串。
要显示一个基于已经存在的连接串,这个有点令人费解。下面是一个例子。
oledb::IDataSourceLocatorPtr p_IDSL = NULL;
_ConnectionPtr p_conn = NULL;
p_IDSL.CreateInstance( __uuidof( oledb::DataLinks ));
p_conn.CreateInstance( "ADODB.Connection" );
p_conn->ConnectionString = _bstr_t("your connection string");
IDispatch * p_Dispatch = NULL;
p_conn.QueryInterface( IID_IDispatch, (LPVOID*) & p_Dispatch );
p_IDSL->PromptEdit( &p_Dispatch );
p_Dispatch->Release();
可以编辑的版本需要另外的一些步骤。第一,你需要创建一个连接对象(Connection Object)并设定它的连接串,然后使用QueryInterface转化成一个IDispatch指针,最后传递到PromptEdit函数。
PromptEdit返回一个BOOL值,如果用户点击OK,那么返回TRUE,否则返回FALSE。如果是TRUE的话,p_conn对象的ConnectionString属性将被设定为新的用户定义的连接参数。
程序编译环境:VC6, MDAC 2.1 ( ADO 2.1 ), Win9x / NT
介绍 Introduction
我最近在我的使用ADO应用程序中需要容许用户能够根据自己的需要配置一个连接串。搜索了最近的文档之后,发现没有任何关于怎样实现这个的信息。除了当从MDAC2.0到2.1过渡时,知识库中文章(Q225132)描述了一个使用#import声明的问题。这个刺激了我来写一篇文章来演示如何使你在你的应用程序中使用OLE DB的数据连接属性对话框。
这个数据连接对话框包含在OLEDB32.DLL(在MDAC2.1,MDAC2.1中在MSDASC.DLL)。他已经非常容易使用了。通过创建一个IdataSourceLocator接口实例,你就可以弹出这个对话框,并且快速的配置ADO数据源。
好了,让我们来看一看怎样实现他呢?我已经创建了一个简单的控制台程序工程,来演示如何做到这一点,在文章末,可以通过连接下载这个工程文件。
输入类型库 Importing the type libraries
首先,装入工程并打开一个源文件(datalink.cpp)。在这个源文件中,我已经很好的注释了其中的语句,因此你可以很容易的读懂它。但是那儿仍有些关键的点。
#import "c:\program files\common files\system\ado"
"\msado20.tlb" no_namespace rename("EOF", "IsEOF")
rename("BOF", "IsBOF")
#import "c:\program files\common files\system\ole "
db\oledb32.dll" rename_namespace("oledb")
头文件顶端的#import声明语句将告诉编译器生成一些文件,以使得我们使用数据连接和ADO对象的智能指针。这些输入声明语句也容许我们使用ADO对象,最重要的是对于本文所说的数据连接属性对话框。
显示数据连接属性对话框 Displaying the Data Link Properties Dialog
main()函数包含了一些代码,这些代码的作用是让我们装入或者保存一个预定义的连接字符串。我假定你已经对于IO类很熟悉了,因此我将略过这个部分,这部分只是演示给你在显示这个数据连接属性对话框时使用预定义的连接字符串。
例如,如下的代码段告诉你怎样显示这个对话框,来创建一个新的连接字符串(错误检查已经被移除)
oledb::IDataSourceLocatorPtr p_IDSL = NULL;
_ConnectionPtr p_conn = NULL;
p_IDSL.CreateInstance( __uuidof( oledb::DataLinks ));
p_conn = p_IDSL->PromptNew();
PromptNew函数的功能就是显示一个新的要求用户健入所有参数的对话框,在返回时,p_conn即可以是NULL,这是当用户点击了取消按钮,也可以是包含一个创建好的连接(Connection)对象,根据用户的选择,这个对象的数据成员ConnectionString被设定为ADO的连接字符串。
要显示一个基于已经存在的连接串,这个有点令人费解。下面是一个例子。
oledb::IDataSourceLocatorPtr p_IDSL = NULL;
_ConnectionPtr p_conn = NULL;
p_IDSL.CreateInstance( __uuidof( oledb::DataLinks ));
p_conn.CreateInstance( "ADODB.Connection" );
p_conn->ConnectionString = _bstr_t("your connection string");
IDispatch * p_Dispatch = NULL;
p_conn.QueryInterface( IID_IDispatch, (LPVOID*) & p_Dispatch );
p_IDSL->PromptEdit( &p_Dispatch );
p_Dispatch->Release();
可以编辑的版本需要另外的一些步骤。第一,你需要创建一个连接对象(Connection Object)并设定它的连接串,然后使用QueryInterface转化成一个IDispatch指针,最后传递到PromptEdit函数。
PromptEdit返回一个BOOL值,如果用户点击OK,那么返回TRUE,否则返回FALSE。如果是TRUE的话,p_conn对象的ConnectionString属性将被设定为新的用户定义的连接参数。
#4
根本没搞清LZ问什么。
可建立一个 .UDL 文件测试OLE DB的链接属性。
例子(连SQL Server的):
[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=server01;Auto Translate=False;Application Name=mydb
用文本编辑器录入以上内容(代换成你需要的),保存成.udl文件,双击。然后根据需要定制内容。
程序中直接用此文件链接数据库,例如:
strConnection = _T("File Name="+strAppPath+"\\mydb.udl;");
可建立一个 .UDL 文件测试OLE DB的链接属性。
例子(连SQL Server的):
[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=server01;Auto Translate=False;Application Name=mydb
用文本编辑器录入以上内容(代换成你需要的),保存成.udl文件,双击。然后根据需要定制内容。
程序中直接用此文件链接数据库,例如:
strConnection = _T("File Name="+strAppPath+"\\mydb.udl;");
#5
谢谢楼上的几位回复!我说的是OLEDB的连接!几位可能用的是ADO(比OLEDB要高一层,可效率要低一些)!
#6
参考http://gamebabyrocksun.blog.163.com/blog/static/571534632008101083957499/