Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utiliser le Boîte de Dialogue standard Source de données ODBC (comme sous windows)

5 réponses
Avatar
Pierre
Bonjour,
Je souhaite dans une application CSHARP utiliser l'Administrateur de Source
de donnée ODBC (panneau de configuration Windows => Outils d'administration)
de façon à récupérer le "ConnectionString " généré par l'utilisateur

Dans un Premier temps j'ai été assez fou de croire que je peux lister
l'ensemble des source et faire un "switch" pour gérer au cas par cas.
il serait nettement plus élegant d'utiliser cette option standard.

je n'arrive pas à trouver un article MSDN traitant de ce sujet.

Le moindre soupçon de piste me sera d'une aide archi-précieuse.

Merci de votre aide

5 réponses

Avatar
Zoury
Salut Pierre ! :O)

Voici une piste..
http://groups.google.com/group/microsoft.public.fr.dotnet.vb/browse_frm/thread/2ca314da63c241ec/c74b51d2812b27bd?lnk=st&q=%22liaison+de+donn%C3%A9es%22+group:*.dotnet.*+author:Zoury&rnum=1&hl=fr#c74b51d2812b27bd


--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Pierre
Bonjour Yanick.

C'est tout à fait ce qu'il me faut

Après avoir reférencé MSDASC et ADODB (object COM)

j'ai testé le code suivant :

MSDASC.DataLinksClass dlgLink = new MSDASC.DataLinksClass();

ADODB.ConnectionClass cn = new ADODB.ConnectionClass();

dlgLink.PromptNew(); /// affiche les sources de données et
permet de construire une nouvelle chaine de connexion

Mais comment faire pour recupérer la chaine de Connection construite ?
dlgLink.PromptNew() renvoie un COM object difficile à transtyper.

Merci de votre aide.



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news: uyhBtJ%
Salut Pierre ! :O)

Voici une piste..
http://groups.google.com/group/microsoft.public.fr.dotnet.vb/browse_frm/thread/2ca314da63c241ec/c74b51d2812b27bd?lnk=st&q=%22liaison+de+donn%C3%A9es%22+group:*.dotnet.*+author:Zoury&rnum=1&hl=fr#c74b51d2812b27bd


--
Cordialement
Yanick
MVP pour Visual Basic



Avatar
Zoury
Salut Pierre ! :O)

Voici une technique qui fonctionne :
http://groups.google.com/group/microsoft.public.fr.dotnet.csharp/msg/627ebe5bd53c40a1?hl=fr

--
Cordialement
Yanick
MVP pour Visual Basic
"Pierre" a écrit dans le message de news:
ewOK$
Bonjour Yanick.

C'est tout à fait ce qu'il me faut

Après avoir reférencé MSDASC et ADODB (object COM)

j'ai testé le code suivant :

MSDASC.DataLinksClass dlgLink = new MSDASC.DataLinksClass();

ADODB.ConnectionClass cn = new ADODB.ConnectionClass();

dlgLink.PromptNew(); /// affiche les sources de données et
permet de construire une nouvelle chaine de connexion

Mais comment faire pour recupérer la chaine de Connection construite ?
dlgLink.PromptNew() renvoie un COM object difficile à transtyper.

Merci de votre aide.



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news: uyhBtJ%
Salut Pierre ! :O)

Voici une piste..
http://groups.google.com/group/microsoft.public.fr.dotnet.vb/browse_frm/thread/2ca314da63c241ec/c74b51d2812b27bd?lnk=st&q=%22liaison+de+donn%C3%A9es%22+group:*.dotnet.*+author:Zoury&rnum=1&hl=fr#c74b51d2812b27bd


--
Cordialement
Yanick
MVP pour Visual Basic







Avatar
Pierre
IMPECCABLE ça roule comme sur des roulettes,
Merci
@+


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Salut Pierre ! :O)

Voici une technique qui fonctionne :
http://groups.google.com/group/microsoft.public.fr.dotnet.csharp/msg/627ebe5bd53c40a1?hl=fr

--
Cordialement
Yanick
MVP pour Visual Basic
"Pierre" a écrit dans le message de news:
ewOK$
Bonjour Yanick.

C'est tout à fait ce qu'il me faut

Après avoir reférencé MSDASC et ADODB (object COM)

j'ai testé le code suivant :

MSDASC.DataLinksClass dlgLink = new MSDASC.DataLinksClass();

ADODB.ConnectionClass cn = new ADODB.ConnectionClass();

dlgLink.PromptNew(); /// affiche les sources de données
et permet de construire une nouvelle chaine de connexion

Mais comment faire pour recupérer la chaine de Connection construite ?
dlgLink.PromptNew() renvoie un COM object difficile à transtyper.

Merci de votre aide.



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news: uyhBtJ%
Salut Pierre ! :O)

Voici une piste..
http://groups.google.com/group/microsoft.public.fr.dotnet.vb/browse_frm/thread/2ca314da63c241ec/c74b51d2812b27bd?lnk=st&q=%22liaison+de+donn%C3%A9es%22+group:*.dotnet.*+author:Zoury&rnum=1&hl=fr#c74b51d2812b27bd


--
Cordialement
Yanick
MVP pour Visual Basic











Avatar
Simon Mourier [SoftFluent]
Voici une version SANS référence directe aux objects MSDAC, et un utilitaire
pour convertir une connection string oledb en ado.net
Simon.
www.softfluent.com


/// <summary>
/// A UI utility class to configure connection strings. Author: simon
mourier @ softfluent
/// </summary>
public class DataSource
{
private const int DBPROMPTOPTIONS_NONE = 0;
private const int DBPROMPTOPTIONS_WIZARDSHEET = 0x1;
private const int DBPROMPTOPTIONS_PROPERTYSHEET = 0x2;
private const int DBPROMPTOPTIONS_BROWSEONLY = 0x8;
private const int DBPROMPTOPTIONS_DISABLE_PROVIDER_SELECTION = 0x10;
private const int DBPROMPTOPTIONS_DISABLESAVEPASSWORD = 0x20;

static private readonly Guid CLSID_DataLinks = new Guid(
0x2206CDB2,0x19C1,0x11D1,0x89,0xE0,0x00,0xC0,0x4F,0xD7,0xA8,0x29);

static private readonly Guid IID_IDBPromptInitialize = new Guid(
0x2206CCB0,0x19C1,0x11D1,0x89,0xE0,0x00,0xC0,0x4F,0xD7,0xA8,0x29);

static private readonly Guid IID_IDBInitialize = new Guid(
0x0C733A8B,0x2A1C,0x11CE,0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D);

static private readonly Guid IID_IDataInitialize = new Guid(
0x2206CCB1,0x19C1,0x11D1,0x89,0xE0,0x00,0xC0,0x4F,0xD7,0xA8,0x29);

private const int CLSCTX_ALL = /*CLSCTX_INPROC_SERVER*/1 |
/*CLSCTX_INPROC_HANDLER*/2 | /*CLSCTX_LOCAL_SERVER*/4 |
/*CLSCTX_REMOTE_SERVER*/16;

[ComImport, Guid("0C733A8B-2A1C-11CE-ADE5-00AA0044773D"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
private interface IDBInitialize
{
[PreserveSig]
int Initialize();

[PreserveSig]
int Uninitialize();
}

[ComImport, Guid("2206CCB1-19C1-11D1-89E0-00C04FD7A829"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
private interface IDataInitialize
{
[PreserveSig]
int GetDataSource(
[In]
IntPtr pUnkOuter,
[In]
int dwClsCtx,
[In, MarshalAs(UnmanagedType.LPWStr)]
string pwszInitializationString,
[In, MarshalAs(UnmanagedType.LPStruct)]
Guid riid,
[Out, MarshalAs(UnmanagedType.Interface)]
out IDBInitialize ppDataSource);

[PreserveSig]
int GetInitializationString(
[In, MarshalAs(UnmanagedType.Interface)]
IDBInitialize pDataSource,
[In]
byte fIncludePassword,
[Out, MarshalAs(UnmanagedType.LPWStr)]
out string pstr);

[PreserveSig]
int CreateDBInstance(/*not defined yet*/);

[PreserveSig]
int CreateDBInstanceEx(/*not defined yet*/);

[PreserveSig]
int LoadStringFromStorage(/*not defined yet*/);

[PreserveSig]
int WriteStringToStorage(/*not defined yet*/);
}

[ComImport, Guid("2206CCB0-19C1-11D1-89E0-00C04FD7A829"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
private interface IDBPromptInitialize
{
IntPtr PromptDataSource(
IntPtr pUnkOuter,
IntPtr hWndParent,
int dwPromptOptions,
int cSourceTypeFilter,
IntPtr rgSourceTypeFilter,
[In, MarshalAs(UnmanagedType.LPWStr)] string pwszszzProviderFilter,
[In, MarshalAs(UnmanagedType.LPStruct)] Guid riid);

[PreserveSig]
int PromptFileName(/*not defined yet*/);
}

[DllImport("ole32", CharSet=CharSet.Unicode, PreserveSigúlse)]
static private extern IntPtr CoCreateInstance(
[In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
IntPtr pUnkOuter,
int dwClsContext,
[In, MarshalAs(UnmanagedType.LPStruct)] Guid riid);


/// <summary>
/// Prompts the desktop user for the standard datasource choice dialog
box.
/// </summary>
/// <param name="hWndParent">An existing Win32 window handle.</param>
/// <returns>The resulting SqlConnection connection string. May not be
null.</returns>
public static string PromptConnectionString(IntPtr hWndParent)
{
IntPtr pIDBInitialize = IntPtr.Zero;
IntPtr pIDBPromptInitialize = IntPtr.Zero;
IntPtr pIDataInitialize = IntPtr.Zero;

IDBPromptInitialize promptInit = null;
IDBInitialize init = null;
IDataInitialize dinit = null;

string str = null;
try
{
pIDBPromptInitialize = CoCreateInstance(CLSID_DataLinks, IntPtr.Zero,
CLSCTX_ALL, IID_IDBPromptInitialize);

promptInit =
(IDBPromptInitialize)Marshal.GetObjectForIUnknown(pIDBPromptInitialize);
pIDBInitialize = promptInit.PromptDataSource(IntPtr.Zero, hWndParent,
DBPROMPTOPTIONS_PROPERTYSHEET, 0, IntPtr.Zero, null, IID_IDBInitialize);

init = (IDBInitialize)Marshal.GetObjectForIUnknown(pIDBInitialize);

pIDataInitialize = CoCreateInstance(CLSID_DataLinks, IntPtr.Zero,
CLSCTX_ALL, IID_IDataInitialize);

dinit = (IDataInitialize)Marshal.GetObjectForIUnknown(pIDataInitialize);
dinit.GetInitializationString(init, 1, out str);
}
catch(COMException e)
{
if (e.ErrorCode != -2147217842) // 0x80040E4E cancel
throw e;
}
finally
{
if (promptInit != null)
Marshal.ReleaseComObject(promptInit);
if (init != null)
Marshal.ReleaseComObject(init);
if (dinit != null)
Marshal.ReleaseComObject(dinit);

if (pIDBPromptInitialize != IntPtr.Zero)
Marshal.Release(pIDBPromptInitialize);
if (pIDBInitialize != IntPtr.Zero)
Marshal.Release(pIDBInitialize);
}
return DataSourceUtilities.OleDbToSqlConnectionString(str, false);
}

/// <summary>
/// Removes secure information from a connection string.
/// </summary>
/// <param name="connectionString">An existing SqlConnection connection
string. May not be null.</param>
/// <returns>The resulting SqlConnection connection string. May not be
null.</returns>
public static string BuildSecureConnectionString(string connectionString)
{
if (connectionString == null)
throw new ArgumentNullException("connectionString");
NameValuePairList list = new NameValuePairList(connectionString);
ArrayList pass = list.GetNameValuePairs("password");
if ((pass == null) || (pass.Count == 0))
return connectionString;

for(int i=0;i<pass.Count;i++)
{
NameValuePair nvp = (NameValuePair)pass[i];
nvp.Value = "*";
}
return list.ToString();
}
}


public class DataSourceUtilities
{
/// <summary>
/// Converts an OLEDB connection string to an SqlConnection connection
string. Author: simon mourier @ softfluent
/// </summary>
/// <param name="oleDbConnectionString">An existing OLEDB connection
string. May be null.</param>
/// <param name="sspi">true to force integrated SSPI
authentication.</param>
/// <returns>The resulting SqlConnection connection string. May not be
null.</returns>
public static string OleDbToSqlConnectionString(string
oleDbConnectionString, bool sspi)
{
Hashtable wk = new Hashtable();
wk["application name"] = null;
wk["attachdbfilename"] = null;
wk["connection lifetime"] = null;
wk["connect timeout"] = null;
wk["connection reset"] = null;
wk["current language"] = null;
wk["data source"] = null;
wk["encrypt"] = null;
wk["enlist"] = null;
wk["initial catalog"] = null;
wk["integrated security"] = null;
wk["max pool size"] = null;
wk["min pool size"] = null;
wk["network library"] = null;
wk["packet size"] = null;
wk["password"] = null;
wk["persist security info"] = null;
wk["pooling"] = null;
wk["user id"] = null;
wk["workstation id"] = null;
wk["app"] = null;
wk["extended properties"] = null;
wk["initial file name"] = null;
wk["connection timeout"] = null;
wk["timeout"] = null;
wk["language"] = null;
wk["addr"] = null;
wk["address"] = null;
wk["server"] = null;
wk["network address"] = null;
wk["database"] = null;
wk["trusted_connection"] = null;
wk["net"] = null;
wk["network"] = null;
wk["pwd"] = null;
wk["persistsecurityinfo"] = null;
wk["uid"] = null;
wk["user"] = null;
wk["wsid"] = null;

NameValuePairList list = new NameValuePairList(oleDbConnectionString);
ArrayList sql = new ArrayList();
foreach(NameValuePair pair in list.AllPairs)
{
if (wk.ContainsKey(pair.Name.ToLower()))
{
sql.Add(pair);
}
}

if (sspi)
{
sql.Add(new NameValuePair("Integrated Security", "SSPI"));
}

string str = null;
foreach(NameValuePair pair in sql)
{
if (str != null)
str += ";";

int pos = pair.Value.IndexOfAny(new char[]{'=', '"', '''});
if (pos >= 0)
{
// oledb should have encoded the value properly.
str += pair.Name + "="" + pair.Value + """;
}
else
{
str += pair.Name + "=" + pair.Value;
}
}
return str;
}
}

"Pierre" a écrit dans le message de news:
ewOK$
Bonjour Yanick.

C'est tout à fait ce qu'il me faut

Après avoir reférencé MSDASC et ADODB (object COM)

j'ai testé le code suivant :

MSDASC.DataLinksClass dlgLink = new MSDASC.DataLinksClass();

ADODB.ConnectionClass cn = new ADODB.ConnectionClass();

dlgLink.PromptNew(); /// affiche les sources de données et
permet de construire une nouvelle chaine de connexion

Mais comment faire pour recupérer la chaine de Connection construite ?
dlgLink.PromptNew() renvoie un COM object difficile à transtyper.

Merci de votre aide.



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news: uyhBtJ%
Salut Pierre ! :O)

Voici une piste..
http://groups.google.com/group/microsoft.public.fr.dotnet.vb/browse_frm/thread/2ca314da63c241ec/c74b51d2812b27bd?lnk=st&q=%22liaison+de+donn%C3%A9es%22+group:*.dotnet.*+author:Zoury&rnum=1&hl=fr#c74b51d2812b27bd


--
Cordialement
Yanick
MVP pour Visual Basic