如何使用 C# 创建 ODBC DSN 条目?

2023-12-22

我正在开发一个具有 C++ 扩展存储过程的遗留应用程序。该xsproc使用ODBC连接到数据库,这意味着它需要配置DSN。

我正在更新安装程序(使用 Visual Studio 2008 安装项目创建),并希望有一个可以创建 ODBC DSN 条目的自定义操作,但我很难在 Google 上找到有用的信息。

有人可以帮忙吗?


实际上我最终自己通过操作注册表解决了这个问题。我创建了一个类来包含该功能,我将其内容包含在此处:

///<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();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C# 创建 ODBC DSN 条目? 的相关文章

  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐

  • 将文本读取为 UTF-8 编码

    假设我编写一个函数来解析包含德语的输入流 下面是一个玩具示例 以下内容在我的机器上有效 因为 UTF8 是标准 readLines textConnection Z rich readLines textConnection Z u00FC
  • drawRect 和 CGGraphicsContext 如何工作?

    我正在处理 Core Graphic 中的一些内容 并且正在寻找有关几个主题的一些额外说明 绘制矩形 我对此有所了解 并且知道这是 UIView 的所有绘图方面的所在 但我只是不清楚幕后发生的事情 当我创建一个 UIView 并填写 dra
  • 现在有什么好的 Eclipse 持续测试插件吗?

    我用过麻省理工学院持续测试 http groups csail mit edu pag continuoustesting 插件在过去 但它早已过时 并且不再与任何接近现代版本的 Eclipse 兼容 有人有好的替代品吗 免费自然是首选 我
  • 通过 gradle FileTree.include 删除目录

    我想说 clean delete fileTree a include subdir include aFile 删除目录 subdir 和文件 aFile 但 subdir 并没有被删除 我可以明确地列出它 clean delete a
  • ASP.NET Web Api 依赖注入 - 单例与否

    我正在使用 asp net 构建一个 Web api 并使用 UnityContainer 来处理依赖项 例如 我的身份验证控制器可以依赖于身份验证服务 class AuthController ApiController private
  • MVCDonutCaching - 当父项未缓存甜甜圈时,子项操作出现问题

    我正在使用很棒的MVCDonut缓存 http mvcdonutcaching codeplex com 从 Nuget 打包 以便缓存整个页面 同时保留某些部分不缓存 该过程很简单 一切都按预期进行 我缓存如下 DonutOutputCa
  • JDK8 与 -source 1.7 [默认方法]

    我有以下课程 public class ZonedDateTimeToInstant public static void main final String args throws NoSuchMethodException assert
  • 不使用分号的计算表达式

    给定像 68 32 这样的输入表达式 我们必须在程序中不使用分号进行计算 如果它是 if 或 for 循环内的东西 参考 https www spoj pl problems EXPR2 https www spoj pl problems
  • 如何在postgresql的pg_hba.conf文件中指定主机名?

    我们想要创建一条像这样的线 托管所有所有 vs1 nsdp ir md5 在 pg hba conf 文件中 但它不理解这个主机名 它的IP是192 168 1 60 当我们使用IP地址时就可以了 但它不适用于主机名 我们在我们的 dns
  • Django-rest-auth (dj-rest-auth) 自定义用户注册

    我正在使用 dj rest auth https dj rest auth readthedocs io en latest https dj rest auth readthedocs io en latest 并尝试实现自定义注册表单
  • docker反向代理DNS/网络问题

    我会尝试解释并把它画出来 我想要实现的目标 对不起 糟糕的油漆图 现在 如果我从 10 10 10 0 网络访问它 它就可以完美运行 问题是 DNS 将 jenkins network com 解析为 10 10 10 0 网络 我想通过代
  • 为什么我在没有释放按键的情况下收到 Pygame KEYUP 事件?

    首先 我是一个完全的初学者 所以我没有任何经验 但是我在过去两天搜索了所有可能的地方来解决问题 但找不到它 我在带有 Raspbian 的 Raspberry PI 3 上使用它 我正在尝试在 Python 3 6 中构建一个简单的代码 它
  • Firebase 消息,onMessage 未被调用

    这就是我调用发送消息的方式 sendMessage var key VERY LONG KEY dffdADFDFD vdfDafd var to VERY LONG KEY ADEWerew vdfDafd var notificatio
  • axios - 如何不在多个参数中添加[]?

    Axios 添加方括号如果有多个具有相同名称的参数 则传递给该参数 问题是我不需要包含那些括号 因为我使用Django Rest Framework and Django Filters 如果我使用这个符号 我该如何做到这一点 axios
  • java中如何捕获嵌套异常

    我正在使用 Apache Xalan v 2 7 1 在 Apache Tomcat v6 0 32 中将 XML 转换为 XHTML 有时加载会被客户端取消并引发以下异常 javax xml transform TransformerEx
  • WPF 中的高效实时日志查看器

    我希望 WPF 中有一个高效的日志查看器控件 它可以在添加消息时简单地显示实时日志 连接来自日志系统的通知是没有问题的 但我担心一旦日志行数量变大 日志窗口将随着每个附加日志行而变得缓慢 日志通知事件将仅提供一个日志字符串 以及一些元数据
  • (为什么)我应该“始终”在任何 vue.js 应用程序中使用组件,无论多么简单?

    我刚刚开始使用 vue js 并且已经从文档的第一个入门章节创建了我需要的大部分非常小的功能 现在我想添加一些测试 以确保我的功能在更改后始终有效 通常我会进行 TDD 但这次我必须先学习 vue 然后决定是否继续使用它 所以在寻找文档时我
  • 如何在 Spring 中使用 JDBC 为 ClientDetailsS​​erviceConfigurer 添加客户端?

    我的内存工作如下 Override public void configure ClientDetailsServiceConfigurer clients throws Exception clients inMemory withCli
  • Zend 框架路径问题

    All 我只是想查看除 欢迎使用 Zend Framework 屏幕之外的任何页面 我已经从本教程下载了该项目 http framework zend com docs quickstart create a form http frame
  • 如何使用 C# 创建 ODBC DSN 条目?

    我正在开发一个具有 C 扩展存储过程的遗留应用程序 该xsproc使用ODBC连接到数据库 这意味着它需要配置DSN 我正在更新安装程序 使用 Visual Studio 2008 安装项目创建 并希望有一个可以创建 ODBC DSN 条目