「smartODBCLogin」を実装したい。すべての ODBC データ ソースからすべての engineNames とドライバーのリストをレジストリから取得する方法を知っています。
ここで、これらのソースのどれが利用可能 (アクティブ) であるかを知りたいと思います。(新しい odbcConnection を開くのはうまくいかず、時間がかかります。)
これをC#で実装する方法を知っている人はいますか?
「smartODBCLogin」を実装したい。すべての ODBC データ ソースからすべての engineNames とドライバーのリストをレジストリから取得する方法を知っています。
ここで、これらのソースのどれが利用可能 (アクティブ) であるかを知りたいと思います。(新しい odbcConnection を開くのはうまくいかず、時間がかかります。)
これをC#で実装する方法を知っている人はいますか?
これには (私が知っている) .NET API はありませんが、これにはネイティブの ODBC API があり、Microsoft のサイト (こちら) で詳しく説明されています。ここには、ユーザー DSN とシステム DSN を一覧表示している便利なコード サンプルもあります。CodeProjectには、ドライバー リストを取得するように見えるコード サンプルもあります。
お急ぎの場合は、最初の記事のサンプル (ユーザー DSN とシステム DSN を取得するため) を以下に示します。
システム DSN を取得します。
/// <summary>
/// Gets all System data source names for the local machine.
/// </summary>
public System.Collections.SortedList GetSystemDataSourceNames()
{
System.Collections.SortedList dsnList = new System.Collections.SortedList();
// get system dsn's
Microsoft.Win32.RegistryKey reg = (Microsoft.Win32.Registry.LocalMachine).OpenSubKey("Software");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC.INI");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC Data Sources");
if (reg != null)
{
// Get all DSN entries defined in DSN_LOC_IN_REGISTRY.
foreach (string sName in reg.GetValueNames())
{
dsnList.Add(sName, DataSourceType.System);
}
}
try
{
reg.Close();
}
catch { /* ignore this exception if we couldn't close */ }
}
}
}
return dsnList;
}
ユーザー DSN を取得します。
/// <summary>
/// Gets all User data source names for the local machine.
/// </summary>
public System.Collections.SortedList GetUserDataSourceNames()
{
System.Collections.SortedList dsnList = new System.Collections.SortedList();
// get user dsn's
Microsoft.Win32.RegistryKey reg = (Microsoft.Win32.Registry.CurrentUser).OpenSubKey("Software");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC.INI");
if (reg != null)
{
reg = reg.OpenSubKey("ODBC Data Sources");
if (reg != null)
{
// Get all DSN entries defined in DSN_LOC_IN_REGISTRY.
foreach (string sName in reg.GetValueNames())
{
dsnList.Add(sName, DataSourceType.User);
}
}
try
{
reg.Close();
}
catch { /* ignore this exception if we couldn't close */ }
}
}
}
return dsnList;
}
すべての DSN を取得します。
// Returns a list of data source names from the local machine.
public System.Collections.SortedList GetAllDataSourceNames()
{
// Get the list of user DSN's first.
System.Collections.SortedList dsnList = GetUserDataSourceNames();
// Get list of System DSN's and add them to the first list.
System.Collections.SortedList systemDsnList = GetSystemDataSourceNames();
for (int i = 0; i < systemDsnList.Count; i++)
{
string sName = systemDsnList.GetKey(i) as string;
DataSourceType type = (DataSourceType)systemDsnList.GetByIndex(i);
try
{
// This dsn to the master list
dsnList.Add(sName, type);
}
catch
{
// An exception can be thrown if the key being added is a duplicate so
// we just catch it here and have to ignore it.
}
}
return dsnList;
}
それらをコンボ ボックスにバインドします。
// fill data source names
DevToolShed.OdbcDataSourceManager dsnManager = new DevToolShed.OdbcDataSourceManager();
System.Collections.SortedList dsnList = dsnManager.GetAllDataSourceNames();
for (int i = 0; i < dsnList.Count; i++)
{
string sName = (string)dsnList.GetKey(i);
DevToolShed.DataSourceType type = (DevToolShed.DataSourceType)dsnList.GetByIndex(i);
cbxDataSourceName.Items.Add(sName + " - (" + type.ToString() + " DSN)");
}
完全なソース コードは、上記のリンクから入手できます。