Once again, I dont see the Edit button (does it diseapear after a while?)
Anyway I found a way to do it!
I fond some vb6 code on the web, wich I changed in vb.net, and it worked, but my program uses c# so I translated it to C#, but there is 1 problem (trhe last I hope) that make so it does not work...
heres the solution in VB.NET
Code:
Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Integer, ByVal fRequest As Integer, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Integer
Private Const ODBC_ADD_SYS_DSN As Integer = 4
Public Function CreateSQLServerDSN(ByVal DSNName As String, ByVal ServerName As String, ByVal Database As String) As Boolean
Dim sAttributes As String
sAttributes = "DSN=" & DSNName & Chr(0)
sAttributes = sAttributes & "Server=" & ServerName & Chr(0)
sAttributes = sAttributes & "Database=" & Database & Chr(0)
CreateSQLServerDSN = CreateDSN("SQL Server", sAttributes)
End Function
Public Function CreateAccessDSN(ByVal DSNName As String, ByVal DatabaseFullPath As String) As Boolean
Dim sAttributes As String
TEST TO SEE IF FILE EXISTS: YOU CAN
REMOVE IF YOU DONT WANT IT
If Dir(DatabaseFullPath) = "" Then Exit Function
sAttributes = "DSN=" & DSNName & Chr(0)
sAttributes = sAttributes & "DBQ=" & DatabaseFullPath & Chr(0)
CreateAccessDSN = CreateDSN("Microsoft Access Driver (*.mdb)", sAttributes)
End Function
Public Function CreateDSN(ByVal Driver As String, ByVal Attributes As String) As Boolean
CreateDSN = SQLConfigDataSource(0&, ODBC_ADD_SYS_DSN, Driver, Attributes)
End Function
and the C# Version I came up with:
C#:
[DllImport("ODBCCP32.Dll", SetLastError=true,CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
private static extern int SQLConfigDataSource(int hwndParent, int fRequest,string lpszDriver,string lpszAttributes);
private const int ODBC_ADD_SYS_DSN=4;
public static int CreateSQLServerDSN(string DSNName,string ServerName,string Database)
{
string sAttributes="DSN=" + DSNName + Convert.ToChar(0);
sAttributes+="Server=" + ServerName + Convert.ToChar(0);
sAttributes+="Database=" + Database + Convert.ToChar(0);
return CreateDSN("SQL Server",sAttributes);
}
public static int CreateAccessDSN(string DSNName,string DatabaseFullPath)
{
int returnValue=0;
string sAttributes;
if(System.IO.File.Exists(DatabaseFullPath))
{
sAttributes="DSN=" + DSNName + Convert.ToChar(0);
sAttributes+="DBQ=" + DatabaseFullPath + Convert.ToChar(0);
returnValue=CreateDSN("Microsoft Access Driver (*.mdb)", sAttributes);
}
return returnValue;
}
public static int CreateDSN(string Driver,string Attributes)
{
return SQLConfigDataSource(0,ODBC_ADD_SYS_DSN,Driver,Attributes);
}
the problem comes at the last line, and I suspect it actually comes from the Chr(0) to Convert.ToChar(0) translation, because in C# Attribues="DSN=100232\0DBQ=C:\\bd\\1002.mdb\0"
and in vb.net is it: "DSN=100232
the fact that the string is unfinished tells me that its probably multiline or something, and that the watcher just does not show the DBQ=C\bd\1002.mdb"
thats what I guess anyway...
so does anyone know what is the REAL remplacement for Chr(0) in C#, or does anyone see something else?
PS
(I am really sorry for triple posting, but I assure you the edit button is not here
))
============================EDIT===========================
I fond Another way of doing it directly in C#, wich include playing directly with the registry, this:
MSDN article
helped me find a way to do it:
C#:
private void CreerODBCAcessDSN(string dsnName,string dbq, string driver, string uID)
{
RegistryKey software = Registry.LocalMachine.OpenSubKey("Software",true);
RegistryKey odbc=software.OpenSubKey("ODBC",true);
RegistryKey odbcini=odbc.OpenSubKey("ODBC.INI",true);
RegistryKey nwKey=odbcini.CreateSubKey(dsnName);
nwKey.SetValue("DBQ",dbq);
nwKey.SetValue("Driver",driver);
//nwKey.SetValue("DriverId",driverId);
nwKey.SetValue("FIL","MS Access;");
nwKey.SetValue("DriverId",0x00000019);
nwKey.SetValue("SafeTransactions",0x00000000);
nwKey.SetValue("UID",uID);
RegistryKey engine=nwKey.CreateSubKey("Engines");
RegistryKey jet=engine.CreateSubKey("Jet");
jet.SetValue("ImplicitCommitSync","");
jet.SetValue("MaxBufferSize",0x00000800);
jet.SetValue("PageTimeout",0x00000005);
jet.SetValue("Threads",0x00000003);
jet.SetValue("UserCommitSync","Yes");
jet.Close();
engine.Close();
nwKey.Close();
RegistryKey odbcdata = odbcini.OpenSubKey("ODBC Data Sources",true);
odbcdata.SetValue(dsnName,"Microsoft Access Driver (*.mdb)");
odbcdata.Close();
odbcini.Close();
odbc.Close();
software.Close();
}
WARNING:: Ive only tested in on my computer, and some of the value I entered may or may not be system dependant... I sugest being carefull as it could hurt your registry.
PS: before using this code, check an exemple of what is actually in the registry by making a false entry by the ODBC creating tool, and then check the resul with regedit