AWS RedShift - .NET Core(是否支持ODBC?)

7

我该如何使用.NET Core连接并查询AWS RedShift?请提供代码示例。我已经阅读了AWS和.Net Core的文档,但没有成功。

3个回答

8

这个答案只适用于特定时间点,可能会随着时间变化而过时...

EntityFramework Core 项目是我最关注的项目之一。缺乏 ODBC 是众所周知的问题,特别是对于那些想要连接 Oracle 的人来说。目前,你可能需要在 .NET Core 上分叉一个 Oracle 客户端,并根据需要进行修改。

我在快速谷歌搜索后找到了以下几个项目,可以帮助你:

- https://github.com/LinqDan/oracleclientcore - https://github.com/LinqDan/Mono.Data.OdbcCore

长期来看,你需要关注这两个 GitHub 问题,它们正在跟踪 EntityFramework Core 和 .NETStandard API.. 的支持情况

更新于 2017 年 6 月 23 日:

现在可以通过 Npgsql.EntityFrameworkCore.PostgreSQL NuGet 包和相关的 Entity Framework Core 包来实现。显然,PostgreSQL 团队对于等待 ODBC 的支持已经不耐烦了(即使在最新的 netstandard2.0 中仍然不可用),他们使用 netstandard 编写了自己的驱动程序 - 在去年 11 月份。 npgsql 网站上的入门指南介绍了其在旧的 JSON 项目格式中的用法 - 但所列出的依赖关系仍然有效。

下面是如何使用此包的方法...

using (var conn = new NpgsqlConnection("Host=myserver;Username=mylogin;Password=******;Database=music"))
{
    conn.Open();
    using (var cmd = new NpgsqlCommand())
    {
        cmd.Connection = conn;

        cmd.CommandText = "SELECT name FROM artists";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine(reader.GetString(0));
            }
        }
    }
}

使用此驱动程序时需要注意一点 - 它是为PostgreSQL而编写的,而不是Redshift。虽然Redshift基于PostgreSQL,但其底层引擎更像Cassandra而不是其他任何东西。因此,亚马逊在开发过程中必须做出一些选择,放弃了PostgreSQL支持的某些内容 - 例如SQL变量。由于这个原因,在其他Entity Framework实现中您可能习惯了的某些事情方面,您将会有相当受限制的体验。只要您继续使用直接访问*Connection、*Command和DataReader类并编写自己的SQL,您就应该没问题。

我更新了我的回答@shahed-kazi,包括一个纯.NET Standard连接方法。 - William Holroyd

1
在撰写本答案时,Redshift 已经有了可用的 ODBC 驱动程序。
对于Windows,您可以在此找到“Amazon Redshift”驱动程序安装文件:
https://docs.aws.amazon.com/redshift/latest/mgmt/install-odbc-driver-windows.html 这需要安装在运行所需应用程序以连接到 Redshift 的机器(或机器)上。对于自动化部署,最好编写一个 PowerShell 脚本(或 MSBuild 步骤),检查生产机器上是否已安装,并在不存在时进行安装。
对于Linux,可以在此找到驱动程序:
https://docs.aws.amazon.com/redshift/latest/mgmt/install-odbc-driver-linux.html 由于大部分 .NET Core 世界正在向使用 Linux docker 容器转移,因此我将进一步阐述如何在 docker 环境中使用 Dockerfile 进行设置。
首先,您需要创建一个shell脚本(例如install-driver.sh),该脚本从上面的链接中使用apt-get获取所需的odbc驱动程序。
类似于这样:
#!/bin/bash

# Install the Redshift ODBC driver manager
apt-get update \
    && apt-get install -y --no-install-recommends unixodbc

if ! curl -s https://s3.amazonaws.com/redshift-downloads/drivers/odbc/[latestversion].deb -o driver.deb; then
    echo 'Failed to download Redshift ODBC Driver!' 1>&2
    exit 1
fi

# Install the Redshift ODBC driver
apt install ./driver.deb

在Linux上配置Amazon Redshift ODBC驱动程序还需要三个文件:amazon.redshiftodbc.iniodbc.iniodbcinst.ini,具体请参见:
https://docs.aws.amazon.com/redshift/latest/mgmt/odbc-driver-configure-linux-mac.html 如上文所述,您需要将以下行添加到.sh文件中:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export ODBCINI=/etc/odbc.ini
export AMAZONREDSHIFTODBCINI=/etc/amazon.redshiftodbc.ini 
export ODBCSYSINI=/usr/local/odbc 

一旦您创建了.sh.ini文件,请将它们放入一个共同的目录中(例如,/odbc/),并将其包含为Dockerfile命令的一部分。类似这样:
FROM microsoft/dotnet:2.1-sdk AS base
WORKDIR /app # or wherever your working directory resides

COPY ./odbc/odbc.ini /etc/odbc.ini
COPY ./odbc/odbcinst.ini /etc/odbcinst.ini
COPY ./odbc/amazon.redshiftodbc.ini /etc/amazon.redshiftodbc.ini
COPY ./odbc/install-driver.sh /tmp/install-driver.sh

RUN chmod +x /tmp/install-driver.sh
RUN /tmp/install-driver.sh

# dotnet restore, build, publish and ENTRYPOINT commands here...

那应该足够让您在Docker容器中运行安装了Redshift驱动程序的docker builddocker run命令。这意味着您的应用程序代码可以像任何其他数据库驱动程序一样使用OdbcConnection
using System;
using System.Data;
using System.Data.Odbc;

// field within class... value should be set from config
private string redshiftConnectionString = "Driver={Amazon Redshift (x64)}; Server=redshiftclusterhostname.region.redshift.amazonaws.com; Database=database; UID=user; PWD=password; Port=5439"

public DataSet ExecuteQuery(string query)
{
    var dataSet = new DataSet();

    using (var connection = new OdbcConnection(this.redshiftConnectionString))
    {
        var adapter = new OdbcDataAdapter(query, connection);
        adapter.Fill(dataSet);
    }

    return dataSet;
}

请注意,Driver=的值应该是你选择下载和安装的驱动程序的名称。

-5

只需通过JDBC或ODBC驱动程序连接到Amazon Redshift,并像普通的SQL数据库一样访问它。

您将使用AWS API启动/停止集群,但所有查询和请求都通过SQL连接进行。


谢谢John,我理解了,不过你能提供一些使用.NET Core实现的示例代码吗? - sk1900
我认为 .NET Core 不支持通过 ODBC 驱动程序连接/查询。 - sk1900
这篇文章并没有回答关于使用到目前为止(2.0)仍未具备ODBC功能的.NET Core的关键问题,该功能计划在2.1版本中实现。相关讨论可参考:https://github.com/dotnet/corefx/issues/13035 - Andrew Harris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接