【问题标题】:C# SqlConnection Exception: Keyword not Supported 'Port'C# SqlConnection 异常:不支持关键字“端口”
【发布时间】:2018-07-29 00:23:05
【问题描述】:

我看过很多相同主题的帖子。 但都没有帮助我。 我想将 Postgresql 与 CrossPlatform-App 一起使用。稍后我将使用云中的服务器,但为了尝试,我认为使用本地数据库更容易。 因此,我已经安装了数据库本身和带有“NuGet”的“npgsql”包,就像 Postgres 人推荐的那样。在连接时总是遇到同样的错误后,我将代码简化为一个控制台应用程序,实际上只有十行代码。

namespace SqlTester_ConsolApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string MyConnection = "Server=127.0.0.1;Port=5432;Database=sample;UserId=Postgresql;Password=zzzzzzzzz;";

            try
            {
                SqlConnection Connection = new SqlConnection(MyConnection);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("---------------------------------------------------------------------");
                System.Diagnostics.Debug.WriteLine(ex.ToString());
            }
            System.Diagnostics.Debug.WriteLine("Ready");
        }
    }
}

new SqlConnection 总是以 System.ArgumentException 告诉 Keyword not supported 'port' 结束。 原因很清楚,.Net 框架尝试使用 SQL Server 而不是将我的字符串传递给 npgsql 驱动程序。因此,从字符串中删除“端口”是没有意义的。

我的问题是我怎样才能将字符串解析更改为 Progresql 提供程序?我没有为错误的选择做任何事情,这显然是 .Net 框架的默认行为的一部分,它要么是错误或仅支持 MS 产品的意图。

我尝试了一些方法来改变这种行为。 澄清更新:因为“NpgsqlConnection”的使用对我来说是不可接受的。我的代码应该独立于提供者。

正如我在 Postgresql-Docu 到 npgsql 和另一个 question 中发现的同样问题,我将以下行添加到 Console-App 的 App.Configfile 中。

<system.data>
  <DbProviderFactories>
    <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
  </DbProviderFactories>
  <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"></defaultConnectionFactory>
</system.data>

它没有帮助。另一件事是,如果它对 App.Config 有帮助,我该如何将它转移到我的跨平台应用程序。没有 App.Config。

我的问题是环境而不是编程本身。在从事其他工作多年后,我再次开始编程。所以所有的环境对我来说都是全新的。在那之前,Visual Studio 会自动处理任何事情。所以我不必学习很多细节。我试图找到有关 DbProviderFactories 的 .Net-internals 和应用程序配置的一些信息。但是我没有找到有用的信息,主要是因为不知道如何搜索。所以任何帮助对我都有用。提前致谢。

【问题讨论】:

  • 如果您使用SqlConnection,那么它将尝试连接到 SQL Server。请改用NpgsqlConnection
  • “我的问题是环境而不是编程本身。” - 不,使用 SqlConnection 与 Postgres 对话显然是错误的
  • 您想使用基类 DbConnection 而不是 SQL Server 特定的 SqlConnection

标签: c# sql postgresql sqlconnection


【解决方案1】:

SqlConnection 特定于 SQL Server。您需要使用 NpgsqlConnection 来使用 Postgres 连接,这意味着您将需要对 Postgres 程序集的引用。

但是您打算在将来转移到不同的提供程序,因此为了尽量减少该转移的影响,请尝试在您的代码中使用通用基类。例如:

var connString = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";
using (DbConnection conn = new NpgsqlConnection(connString))
{
    conn.Open()
    using (DbCommand command = conn.CreateCommand())
    {
        // etc
    }
}

这样,当您进行交换时,您只需将解决方案中的 NpgsqlConnection 替换为 SqlConnection。如果你想使用DbProviderFactory(那里有一个很好的例子)那么你可以,但基本上你只是为自己节省了这个单一的搜索/替换,删除引用,并发布一个新版本的代码。

我建议putting the connection string in the config file 而不是代码(如问题中所示)以避免在多个地方使用它,并使其更容易在不重建的情况下进行更改。

当然,您可能必须在 SQL 本身中修复任何特定于实现的细节。

【讨论】:

    【解决方案2】:

    以下是帮助您入门的基本代码。但是对于初学者来说最好的方式是通过教程http://www.npgsql.org/doc/index.html

    var connString = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";
    using (var conn = new NpgsqlConnection(connString))
    {
        conn.Open();
    }
    

    【讨论】:

    • 谢谢,它可以工作,但是我的所有代码都依赖于 Npgsql,以后对数据库的任何更改都将是可怕的。我错过了说我打算避免这种依赖。独立于 Db-Provider 很重要。因此,Config-File 的更改完全来自同一个教程 (link)。
    猜你喜欢
    • 1970-01-01
    • 2017-12-26
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2014-03-11
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多