惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
The GitHub Blog
The GitHub Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
量子位
Martin Fowler
Martin Fowler
月光博客
月光博客
P
Proofpoint News Feed
博客园_首页
Y
Y Combinator Blog
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Visual Studio Blog
H
Help Net Security
U
Unit 42
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
MongoDB | Blog
MongoDB | Blog
F
Fortinet All Blogs
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 夏日微风

mysql备份和恢复命令 urllib2下载时判断网页编码 使用setuptools自动安装python模块 Python的MySQL库 php2python Python中文支持小结 WordPress安装步骤 centos 5.6 升级php到5.3 vsftp 的默认目录位置 Linux Develop Notes Linux Command Notes C#格式化数值结果表 - 夏日微风 - 博客园 证监会新年联欢会节目单(征求意见稿) 命案十三宗 看港剧,学穿衣 - 欧阳震华 看港剧,学穿衣 - 张家辉 - 胖矮个 看港剧,学穿衣 - 林保怡 - 小矮个 看港剧,学穿衣 - 罗嘉良 - 土蛋 看港剧,学穿衣 - 苏永康 - 斯文丑男
在.NET中打开ODBC“选择数据源”对话框
夏日微风 · 2004-12-23 · via 博客园 - 夏日微风

在VB和C++中,都有相应的函数来打开ODBC的“选择数据源”对话框,且简单方便。


年轻气盛的.Net,偏偏抛弃了这个对话框;在类库中百复千转,就是没有找到。无奈之下,自己动手。真是信天信地不如信自己,连MS都不能信了,你说还能信谁呢?:)  权衡一翻后,选择了用VC开发一个小COM,在.NET中拉使用。


ODBC API中有 SQLDriverConnect,即是显示“选择数据源”对话框的。代码非常简单,不过十多行,与同好共享:

#ifdef UNICODE
    #define MYSQLCHAR    SQLWCHAR
#
else
    #define MYSQLCHAR    SQLCHAR
#endif

STDMETHODIMP CODBCSourceSelector::Open( OLE_HANDLE hwnd, BSTR 
*connectionString)
{
    CComBSTR bstrConnectionString;

    MYSQLCHAR szConnectOutput[MAX_CONNECT_LEN];
    memset( szConnectOutput, 
0, sizeof( szConnectOutput ) * sizeof( UCHAR ) );

    SQLHDBC hdbc 
= SQL_NULL_HANDLE;
    SQLHENV henv 
= SQL_NULL_HANDLE;

    SQLRETURN ret;
    ret 
= SQLAllocEnv( &henv );
    
if ( SQL_SUCCESS == ret || SQL_SUCCESS_WITH_INFO == ret )
    {
        ret 
= SQLAllocConnect( henv, &hdbc );
    }

    
    
if ( SQL_SUCCESS == ret || SQL_SUCCESS_WITH_INFO == ret )
    {
        HWND realWnd 
= (HWND)hwnd;
        
if ( !realWnd )
        {
            realWnd 
= ::GetDesktopWindow();
        }

        SQLSMALLINT cbConnStrOut 
= 0;
        ret 
= SQLDriverConnect( hdbc, realWnd,
            (MYSQLCHAR
*)NULL, 0
            szConnectOutput, _countof(szConnectOutput), 
            
&cbConnStrOut, 3 );

        
if ( SQL_SUCCESS==ret || SQL_SUCCESS_WITH_INFO==ret )
        {
            bstrConnectionString 
= (TCHAR*)szConnectOutput;

            SQLDisconnect( hdbc );
        }
    }


    SQLFreeConnect( hdbc );
    SQLFreeEnv( henv );

    
*connectionString = bstrConnectionString.Detach();

    
return S_OK;
}

整个 project 下载:https://files.cnblogs.com/dumack/ODBCSource.zip