UDL Helper for .NET





0/5 (0 vote)
Retrieve Connection String from user using Common Data Link dialog.
Introduction
Retrieving connection strings using the common Data Link dialog is not supported in .NET.
This solution opens the UDL tool, retrieves a connection string from a user and returns the full connection string to the caller.
It is assumed that
- the consuming application has file-write access to the ApplicationBase directory,
- and the correct association exists for UDL files.
Requirement
We require the following:
- A class that exposes a method
GetConnectionString()
which when called. - Queries the user and returns the result as a standard connection string.
- We expect the class to use the standard DataLink Connection String dialog.
The UdlHelper Class
Implementation will execute the following steps:
- Create a UDL file in the application base directory (if it does not already exist).
- Execute a process with the UDL file as an argument, and wait for the process to complete.
- Read the UDL file as text and extract the connection string.
Default UDL File
A default UDL file is created if not found. The location is specified by a private property called FilePath
.
The minimal content for a UDL file to successfully launch the Data Link Dialog is show below, and this content is written to the new UDL file.
[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;
This text is held in a private member field called _default
. It is important to note that the Data Link tool expects the file to be Unicode encoded.
We can now write the CreateDefaultFile
method:
private void CreateDefaultFile()
{
if (!File.Exists(FilePath))
{
Directory.CreateDirectory(Folder);
File.WriteAllText(FilePath, _default, Encoding.Unicode);
}
}
Execute Data Link Modal Dialog
Once the UDL file is available we can simply create and execute a new process with Process.Start(string filename)
method, and pass our UDL file path, and then wait for the process to complete:
private void ExecuteDataLinkProcessAndWait()
{
var process = Process.Start(FilePath);
process.WaitForExit(Int32.MaxValue);
}
Parse File
We can now open the file, read the Data Link content, then find and store the connection string:
private void ParseFile()
{
var udl = File.ReadAllText(FilePath, Encoding.Unicode);
var rex = new Regex("(Provider[^;]*);(.*)", RegexOptions.Multiline);
var match = rex.Match(udl);
if (match.Success)
{
Provider = match.Groups[1].ToString();
ConnectionString = match.Groups[2].ToString();
Success = true;
}
}
Get Connection String
The publicly exposed GetConnectionString
method simply calls the three methods discussed above, in sequence, and stores the result in the public ConnectionString
property.
public string GetConnectionString()
{
CreateDefaultFile();
ExecuteDataLinkProcessAndWait();
Parse();
return ConnectionString;
}
Usage
Consumer code will simply create an instance of the UdlHelper
class and call the GetConnectionString
method which will return a complete connection string as specified by the user.
var udl = new UdlHelper();
var connString = udl.GetConnectionString();
Other Properties
The UdlHelper
class also exposes the following properties:
Provider
: Database driver provider.DataSource
: Name of database host.Catalog
: Name of databaseUsername
: Username if persist security is true.Password
: Password if persist security is true.
Regular expressions are used to match against the full connection string when the properties are accessed.
Risks
- Executable must have file-write access to the application base directory
- UDL files must be associated with Universal Data Link utility (This is the default association for UDL files on Windows).
- No exception handling.