各位大哥:   大家好1
   小弟菜鸟一个!想找一个报表(最好具有很好的打印预览)控件,不知哪里的比较好?怎么使用,还请赐教!
   本人在本机上建了一个Server实例,不知如何才能自动检测出实例来!(用了SQLBrowseConnect不好用,没测出来)

解决方案 »

  1.   

    cell(国产),formula one,水晶报表,cell是用友做的,后两个是国外的。都可以在vc中使用。
      

  2.   

    监测实例,枚举出odbc中注册的sql数据源不就可以了吗?
      

  3.   

    如何得到系统可用的全部数据源和存储路径----ANDY 2002/12/3 首先枚举出数据源:
    方法一:
    关键函数: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;
    }