Как я создаю ODBC запись DSN с помощью C#?

, если вы не перезагрузили компьютер после установки jdk, просто перезагрузите компьютер.

, если вы хотите создать портативный портативный java и установить путь перед использованием java, просто сделайте batch file, описанный ниже.

, если вы хотите запустить этот командный файл, когда ваш компьютер запустил только ярлык пакетного файла в папке автозагрузки. В загрузочной папке Windows 7 находится «C: \ Users \ user \ AppData\roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup»

сделать пакетный файл следующим образом:

set Java_Home=C:\Program Files\Java\jdk1.8.0_11
set PATH=%PATH%;C:\Program Files\Java\jdk1.8.0_11\bin
Замечание

: java_home и path являются переменными. вы можете сделать любую переменную по своему усмотрению. например set amir=good_boy, и вы можете видеть amir через %amir%, или вы можете видеть java_home с помощью %java_home%

27
задан Neil Barnwell 2 December 2008 в 18:23
поделиться

7 ответов

Я на самом деле решил это сам в конце путем управления реестром. Я создал класс для содержания функциональности, содержание которой я включал здесь:

///<summary>
/// Class to assist with creation and removal of ODBC DSN entries
///</summary>
public static class ODBCManager
{
    private const string ODBC_INI_REG_PATH = "SOFTWARE\\ODBC\\ODBC.INI\\";
    private const string ODBCINST_INI_REG_PATH = "SOFTWARE\\ODBC\\ODBCINST.INI\\";

    /// <summary>
    /// Creates a new DSN entry with the specified values. If the DSN exists, the values are updated.
    /// </summary>
    /// <param name="dsnName">Name of the DSN for use by client applications</param>
    /// <param name="description">Description of the DSN that appears in the ODBC control panel applet</param>
    /// <param name="server">Network name or IP address of database server</param>
    /// <param name="driverName">Name of the driver to use</param>
    /// <param name="trustedConnection">True to use NT authentication, false to require applications to supply username/password in the connection string</param>
    /// <param name="database">Name of the datbase to connect to</param>
    public static void CreateDSN(string dsnName, string description, string server, string driverName, bool trustedConnection, string database)
    {
        // Lookup driver path from driver name
        var driverKey = Registry.LocalMachine.CreateSubKey(ODBCINST_INI_REG_PATH + driverName);
        if (driverKey == null) throw new Exception(string.Format("ODBC Registry key for driver '{0}' does not exist", driverName));
        string driverPath = driverKey.GetValue("Driver").ToString();

        // Add value to odbc data sources
        var datasourcesKey = Registry.LocalMachine.CreateSubKey(ODBC_INI_REG_PATH + "ODBC Data Sources");
        if (datasourcesKey == null) throw new Exception("ODBC Registry key for datasources does not exist");
        datasourcesKey.SetValue(dsnName, driverName);

        // Create new key in odbc.ini with dsn name and add values
        var dsnKey = Registry.LocalMachine.CreateSubKey(ODBC_INI_REG_PATH + dsnName);
        if (dsnKey == null) throw new Exception("ODBC Registry key for DSN was not created");
        dsnKey.SetValue("Database", database);
        dsnKey.SetValue("Description", description);
        dsnKey.SetValue("Driver", driverPath);
        dsnKey.SetValue("LastUser", Environment.UserName);
        dsnKey.SetValue("Server", server);
        dsnKey.SetValue("Database", database);
        dsnKey.SetValue("Trusted_Connection", trustedConnection ? "Yes" : "No");
    }

    /// <summary>
    /// Removes a DSN entry
    /// </summary>
    /// <param name="dsnName">Name of the DSN to remove.</param>
    public static void RemoveDSN(string dsnName)
    {
        // Remove DSN key
        Registry.LocalMachine.DeleteSubKeyTree(ODBC_INI_REG_PATH + dsnName);

        // Remove DSN name from values list in ODBC Data Sources key
        var datasourcesKey = Registry.LocalMachine.CreateSubKey(ODBC_INI_REG_PATH + "ODBC Data Sources");
        if (datasourcesKey == null) throw new Exception("ODBC Registry key for datasources does not exist");
        datasourcesKey.DeleteValue(dsnName);
    }

    ///<summary>
    /// Checks the registry to see if a DSN exists with the specified name
    ///</summary>
    ///<param name="dsnName"></param>
    ///<returns></returns>
    public static bool DSNExists(string dsnName)
    {
        var driversKey = Registry.LocalMachine.CreateSubKey(ODBCINST_INI_REG_PATH + "ODBC Drivers");
        if (driversKey == null) throw new Exception("ODBC Registry key for drivers does not exist");

        return driversKey.GetValue(dsnName) != null;
    }

    ///<summary>
    /// Returns an array of driver names installed on the system
    ///</summary>
    ///<returns></returns>
    public static string[] GetInstalledDrivers()
    {
        var driversKey = Registry.LocalMachine.CreateSubKey(ODBCINST_INI_REG_PATH + "ODBC Drivers");
        if (driversKey == null) throw new Exception("ODBC Registry key for drivers does not exist");

        var driverNames = driversKey.GetValueNames();

        var ret = new List<string>();

        foreach (var driverName in driverNames)
        {
            if (driverName != "(Default)")
            {
                ret.Add(driverName);
            }
        }

        return ret.ToArray();
    }
}
32
ответ дан Neil Barnwell 14 October 2019 в 13:50
поделиться

Существует страница CodeProject при чтении информации о ODBC .

Чтение, которое должно дать Вам информацию, необходимо перепроектировать запись ключей реестра, в которых Вы нуждаетесь.

От того кода;

  private const string ODBC_LOC_IN_REGISTRY = "SOFTWARE\\ODBC\\";
  private const string ODBC_INI_LOC_IN_REGISTRY =
          ODBC_LOC_IN_REGISTRY + "ODBC.INI\\";

  private const string DSN_LOC_IN_REGISTRY =
          ODBC_INI_LOC_IN_REGISTRY + "ODBC Data Sources\\";

  private const string ODBCINST_INI_LOC_IN_REGISTRY =
          ODBC_LOC_IN_REGISTRY + "ODBCINST.INI\\";

  private const string ODBC_DRIVERS_LOC_IN_REGISTRY =
          ODBCINST_INI_LOC_IN_REGISTRY + "ODBC Drivers\\";
2
ответ дан Miguel Garcia 14 October 2019 в 13:50
поделиться

Спасибо за предоставленный код, я сам использовал его. Мне пришлось серьезно изменить две вещи:

Чтобы получить имя_драйвера , мне пришлось использовать OpenSubKey вместо CreateSubKey , чтобы получить значения:

// Lookup driver path from driver name
var driverKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
        ODBCINST_INI_REG_PATH + driverName);

Поскольку Я использую Vista, мне пришлось использовать манифест приложения и установить для requestPrivileges значение:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

Следующая статья помогла мне найти проблему OpenSubKey : http: / /www.daveoncsharp.com/2009/08/read-write-delete-from-windows-registry-with-csharp/

0
ответ дан 28 November 2019 в 05:06
поделиться

+1 для кода Barnwell!

Однако I считают его Dsnexists () запрашивает неправильный ключ. I думаю Это должно быть это:

public static bool DSNExists(string dsnName) 
{ 
    var sourcesKey = Registry.LocalMachine.CreateSubKey(ODBC_INI_REG_PATH + "ODBC Data Sources"); 
    if (sourcesKey == null) throw new Exception("ODBC Registry key for sources does not exist"); 

    return sourcesKey.GetValue(dsnName) != null; 
} 
2
ответ дан 28 November 2019 в 05:06
поделиться

Существует API для выполнения подобных действий. Использование API также обеспечит совместимость вашего приложения с новыми версиями Windows. API можно найти здесь:

http://msdn.microsoft.com/en-us/library/ms716476(VS.85).aspx

PInvoking этой функции в c# можно найти на PInvoke.net.

7
ответ дан 28 November 2019 в 05:06
поделиться

спасибо, это была большая помощь, если вы делаете dsn для excel, возможно, нужно добавить что-то вроде этого

 var dsnKeyEng = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(ODBC_INI_REG_PATH + dsnName + "\\Engines");
 var dsnKeyExl = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(ODBC_INI_REG_PATH + dsnName + "\\Engines\\Excel");

 dsnKeyExl.SetValue("FirstRowHasNames", 01);
 dsnKeyExl.SetValue("MaxScanRows", 8);
 dsnKeyExl.SetValue("Threads",3);
 dsnKeyExl.SetValue("UserCommitSync", "Yes")
0
ответ дан 28 November 2019 в 05:06
поделиться

В дополнение к сообщению chrfalch , вот пример кода для обновления DSN (я знаю, что OP запрашивает создание, однако этот код легко перевести на все, что вам нужно делать) с помощью вызова API, а не напрямую через реестр (используя информацию со страницы pinvoke.net ): -

[DllImport("ODBCCP32.DLL", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool SQLConfigDataSourceW(UInt32 hwndParent, RequestFlags fRequest, string lpszDriver, string lpszAttributes);

enum RequestFlags : int
{
    ODBC_ADD_DSN = 1,
    ODBC_CONFIG_DSN = 2,
    ODBC_REMOVE_DSN = 3,
    ODBC_ADD_SYS_DSN = 4,
    ODBC_CONFIG_SYS_DSN = 5,
    ODBC_REMOVE_SYS_DSN = 6,
    ODBC_REMOVE_DEFAULT_DSN = 7
}

bool UpdateDsnServer(string name, string server)
{
    var flag = RequestFlags.ODBC_CONFIG_SYS_DSN;
    string dsnNameLine = "DSN=" + name;
    string serverLine = "Server=" + server;

    string configString = new[] { dsnNameLine, serverLine }.Aggregate("", (str, line) => str + line + "\0");

    return SQLConfigDataSourceW(0, flag, "SQL Server", configString);
}
8
ответ дан 28 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: