使用 Microsoft .NET 通过 ODBC 连接 PostgreSQL 数据库服务器

来自 PostgreSQL 维基
跳转到导航跳转到搜索

介绍及运行

Microsoft .net CLR(公共语言运行时)提供了多种连接数据库的方式。本文仅介绍使用 ODBC 通过 .net 语言连接 PostgreSQL。
[注意:对于那些不知道的人来说,ODBC 代表“开放式数据库连接”。]

在你阅读本文之前,你可能想看看本文末尾的“已知错误”部分。

第一个重点是,在当前版本的 .net Framework SDK(版本 1.0.3617.0)中,没有内置的 ODBC 支持。你需要下载并安装一个 .net 扩展,名为 odbc.net。可以从 msdn.microsoft.com 下载。

下载的文件名为“odbc_net.msi”。

注意:.msi 文件是微软安装程序文件,如果您的系统安装了微软安装程序(Windows 2000 / XP 和大多数最新的 Windows 版本预装,如果您有旧的操作系统,可以从微软下载),这些文件可运行。

“odbc_net.msi”将为您提供 2 个重要的文件

  • Microsoft.Data.Odbc.dll - 这是一个 dll 文件,需要在编译时链接到您的程序。
  • Odbcref.chm - 这是 dll 中类的文档。

如果您还没有,您需要下载并安装的下一个文件是 PostgreSQL ODBC 驱动程序。以下网站提供了关于 PostgreSQL ODBC 驱动程序的全部信息。

https://odbc.postgresql.ac.cn/

注意(可能已过时):如果您在使用上述驱动程序时遇到问题,您可以下载这个 PostgreSQL ODBC 驱动程序,它会定期更新,最新版本是 2015 年 5 月 15 日发布的。支持 Windows、Linux、Mac OS x,32 位和 64 位。

安装完 ODBC 驱动程序后,您需要添加一个新的用户数据源。这可以通过转到“控制面板”,“管理工具”,“数据源(ODBC)”来实现。然后选择“添加用户 DSN”。
[注意:这些名称和位置可能因不同的 Win 操作系统而略有不同。]

选择 PostgreSQL 驱动程序,并填写您的服务器和数据库详细信息。您还必须指定一个唯一的 DSN 名称;在 Windows 2000 中,此字段在数据输入对话框中被标记为“数据源”,而不是更合适的“数据源名称”。您将在以后的程序中使用此名称来指定要使用的数据库连接。当然,您可以为不同的数据库、服务器和用户创建任意数量的用户 DSN 条目。

您现在可以编写连接到 PostgreSQL 的 .net 程序了。

odbc.net 为您提供了一套类,如 OdbcConnection、OdbcCommand 和 OdbcDataReader;它们允许您与 PostgreSQL 服务器通信。阅读文档,许多类都可用。

以下是一个用 C# 编写的代码示例,它演示了如何打开 ODBC 连接并查询表

// Create the ODBC connection using the unique name you specified when 
// creating your DSN. If desired you may input less information at the
// DSN entry stage and put more in the "DSN=" line below.
OdbcConnection connection = new OdbcConnection("DSN=PostgreSQL");
// "DSN=MyDSN;UID=Admin;PWD=Test" (UID = User name, PWD = password.)


// Open the ODBC connection to the PostgreSQL database and display
// the connection state (status).
connection.Open();
System.Console.WriteLine("State: " + connection.State.ToString());


// Create an ODBC SQL command that will be executed below. Any SQL 
// command that is valid with PostgreSQL is valid here (I think, 
// but am not 100 percent sure. Every SQL command I've tried works).
string query = "SELECT * FROM TESTTABLE";
OdbcCommand command = new OdbcCommand(query, connection);


// Execute the SQL command and return a reader for navigating the results.
OdbcDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);


// This loop will output the entire contents of the results, iterating
// through each row and through each field of the row.
while(reader.Read() == true) 
{
    Console.WriteLine("New Row:");
    for (int i = 0; i < reader.FieldCount; i++)
    {
        Console.WriteLine(reader.GetString(i));
    }
}

// Close the reader and connection (commands are not closed).
reader.Close();
connection.Close();

您需要以通常的方式在程序中指定对 odbc.net dll 的使用,在 C# 中,这可以通过以下行完成

using Microsoft.Data.Odbc;

在编译时,您需要引用 odbc.net dll。典型的 C# 编译命令行类似于

csc /out:run.exe /r:Microsoft.Data.Odbc.dll TestDB.cs

确保 Microsoft.Data.Odbc.dll 位于您的“路径”中,用其完整路径引用,或者位于“编译”目录中。

对于示例只使用 C# 我深感抱歉,我没有使用过任何其他 .net 语言。但我相信,即使符号不同,在其他语言中对类的使用方式也是一样的。odbc.net 中的已知错误。odbc.net 的用户在使用各种 odbc 驱动程序时遇到了一些问题。在使用 odbc.net 与 PostgreSQL ODBC 驱动程序时,发现以下错误。

1) 当查询表且结果包含一个空字符串作为其中一列的值时,如果尝试读取空字符串的值,您可能会收到以下未处理异常


未处理异常:Microsoft.Data.Odbc.OdbcException:NO_DATA
2) 同样,如果某列包含 NULL 值,则未处理异常将是


未处理异常:System.InvalidCastException:指定的转换无效。

问题出在 Microsoft 的数据访问组件上,它是 .net 和 odbc.net 的安装要求。Microsoft 宣布了一个可以从 Microsoft 产品支持服务获得的修复程序,但您需要一个支持合同才能获得它。该修复程序将包含在数据访问组件 2.7 SP1(Service Pack 1)中,该组件将在某个时间点免费提供(尚未公布发布日期)。

更多信息可以在这里找到;问题 ID:Q319243

如果您有任何本文没有涵盖的问题,请将其发布到 pgsql-general 邮件列表或新闻组。您可以直接给我发邮件 <[email protected]>,但我不能保证快速回复。