各位大哥: 大家好1
小弟菜鸟一个!想找一个报表(最好具有很好的打印预览)控件,不知哪里的比较好?怎么使用,还请赐教!
本人在本机上建了一个Server实例,不知如何才能自动检测出实例来!(用了SQLBrowseConnect不好用,没测出来)
小弟菜鸟一个!想找一个报表(最好具有很好的打印预览)控件,不知哪里的比较好?怎么使用,还请赐教!
本人在本机上建了一个Server实例,不知如何才能自动检测出实例来!(用了SQLBrowseConnect不好用,没测出来)
方法一:
关键函数:SQLDataSources 代码如下:UWORD fDirection=SQL_FETCH_FIRST;
SQLCHAR szDSN[SQL_MAX_DSN_LENGTH+1];
SQLCHAR szDescription[100];
SQLRETURN retcode;
SQLHENV henv;
retcode=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
if(retcode!=SQL_SUCCESS)
return FALSE;
retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
while(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)
{
retcode=SQLDataSources(henv,fDirection,(UCHAR*)szDSN,sizeof(szDSN),NULL,(UCHAR*)szDescription,sizeof(szDescription),NULL);
fDirection=SQL_FETCH_NEXT;
if(retcode!=SQL_SUCCESS_WITH_INFO&&retcode!=SQL_SUCCESS)
TRACE("SQLData Sources retuns:%d",retcode);
else TRACE("DSN:[%s]Desc:[%s]\r\n",szDSN,szDescription); ////szDSN即为数据源名称,szDescription为数据源描述
}SQLFreeHandle(SQL_HANDLE_ENV,henv);方法二:用户创建的odbc数据源信息均存放在注册表
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Source
中。枚举其中的符合条件的数据源信息(如:路径)就可以了下面的代码是枚举注册表健和值的代码:枚举键和值#define DIFFFLAGLEN 6
#define PERFENUMKEY ".DEFAULT\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Url History"char szCounter[MAX_PATH];
char szObject[MAX_PATH];
char szName[MAX_PATH];
LPSTR lpszDescBuff = NULL;
char szDiffFlag[DIFFFLAGLEN]; // can contain either "TRUE" or "FALSE"
DWORD rc;
DWORD dwIndex1, dwIndex2;
DWORD dwType;
DWORD dwBufSize;
HKEY hKey;
HKEY hObject;
HKEY hCounter;
CWindowDC dc(this);
rc = RegOpenKeyEx(HKEY_USERS,
PERFENUMKEY, 0, KEY_READ, &hKey);
if (rc == ERROR_SUCCESS)
{
dwBufSize = MAX_PATH;
dwIndex1 = 0;
// enumerate objects
while ( RegEnumValue(hKey, dwIndex1++, szObject, &dwBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS )//枚举键用 RegEnumKeyEx(HKEY_LOCAL_MACHINE, PERFENUMKEY, 0, KEY_READ, &hKey);
{
if ( (rc=RegOpenKeyEx(hKey, szObject, 0, KEY_READ, &hObject))
== ERROR_SUCCESS)
{
// process information on the open key using hObject}
RegCloseKey(hObject);
dwBufSize = MAX_PATH;
}
RegCloseKey(hKey);
}
else
printf("Error %d opening %s\n", rc, PERFENUMKEY); 汇编语言events dd 0
code db 10 DUP(0),0 ReadReg proc uses ebx edx
LOCAL hkeyss:DWORD
LOCAL tem1,tem2:DWORD
LOCAL result1,result2:DWORD
szText RegTable2,".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Url History"
szText ItEvents,"Events"
szText Secode,"Secode"
invoke RegOpenKeyEx,HKEY_USERS,ADDR RegTable2,0,KEY_ALL_ACCESS,ADDR hkeyss
.if eax != ERROR_SUCCESS
mov eax,1
ret
.endif
mov eax,REG_DWORD
mov tem1,eax
mov eax,4
mov tem2,eax
invoke RegQueryValueEx,hkeyss,ADDR ItEvents,NULL,ADDR tem1,ADDR events,ADDR tem2
mov result1,eax
mov eax,REG_SZ
mov tem1,eax
mov eax,10
mov tem2,eax
invoke RegQueryValueEx,hkeyss,ADDR Secode,NULL,ADDR tem1,ADDR code,ADDR tem2
mov result2,eax
invoke RegCloseKey,hkeyss
mov ebx,result1
mov edx,result2
.if ebx !=ERROR_SUCCESS || edx != ERROR_SUCCESS
mov eax,1
.else
xor eax,eax
.endif
ret
ReadReg endp 然后枚举出数据源的存储路径(主要指用户自定义的数据源):这些数据源大都放置在注册表中(用户自定义的数据源放置在HKEY_CURRENT_USER\Software\ODBC\ODBC.INI对于系统定义的数据源放置在HKEY_LOCAL_MECHINE\Software\ODBC\ODBC.INI)数据源的存储路径放在(假设数据源为Mylib,则其存储路径保存在HKEY_LOCAL_MECHINE\Software\ODBC\ODBC.INI\Mylib下的DBQ下只要通过注册表函数读到该值就可以了。具体的如上 另外还可以通过CDatabase data;
data.OpenEx( _T( "DSN=xl" ),
CDatabase::openReadOnly |
CDatabase::noOdbcDialog );
CString str;
str=data.GetDatabaseName();
str里面就是数据源的路径咯! 例子:/*=================================================================
功能:列举出所有的odbc数据源(数据库),并将其显示到
列表框中
参数:iDBType--要列举数据库的类型
参见int GetDBType(CString &strDBType)
返回:返回符合条件的数据库的个数
主要思路:
方法1:用户创建的odbc数据源信息均存放在注册表
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Source
中。枚举其中的符合条件的数据源信息(如:路径)就可以了
方法2:利用SQLDataSources函数
历史纪录:andy 2002/12/3/9:30-2002/12/3/12:00
==================================================================*/
BOOL CListDatabase::EnumDatebase(void)
{
int iDbType=0;
int iCount=0;SQLUSMALLINT uDirection=SQL_FETCH_FIRST_USER;
SQLCHAR szDSN[SQL_MAX_DSN_LENGTH+1];
SQLCHAR szDescription[100];
SQLRETURN retCode;
SQLHENV hEnv;
retCode=::SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
if(retCode!=SQL_SUCCESS)
return FALSE;
retCode=::SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
while(retCode==SQL_SUCCESS||retCode==SQL_SUCCESS_WITH_INFO)
{
retCode=SQLDataSources(hEnv,uDirection,
(UCHAR*)szDSN,
sizeof(szDSN),
NULL,(UCHAR*)szDescription,
sizeof(szDescription),NULL);
uDirection=SQL_FETCH_NEXT;
if(retCode!=SQL_SUCCESS_WITH_INFO&&retCode!=SQL_SUCCESS)
{
TRACE("SQLData Sources retuns:%d",retCode);
}
else
{
iDbType=GetDBType(CString(szDescription));
if(iDbType==1)
{
iCount++;m_listReport.InsertItem(iCount-1,(char*)szDSN);
m_listReport.SetItemText(iCount-1,1,(char*)szDescription);
///////
HKEY key;
int re1;
DWORD tem,tem2[100];
char filter[256];
CString RegTable;
RegTable.Format("Software\\ODBC\\ODBC.INI\\%s",szDSN);re1=RegOpenKeyEx(HKEY_CURRENT_USER,RegTable,0,KEY_QUERY_VALUE,&key);
tem=REG_SZ;
re1=::RegQueryValueEx(key,TEXT("DBQ"),NULL,&tem,(BYTE*)filter,tem2);
if(re1!=ERROR_SUCCESS)
{
m_listReport.SetItemText(iCount-1,2,"未知数据或数据已损坏");
}
else
{
m_listReport.SetItemText(iCount-1,2,filter);
}RegCloseKey(key);
}}
}
SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
return TRUE;
}