C#SqlConnection异常:关键字不支持“端口”

时间:2018-07-29 00:23:05

标签: c# sql postgresql sqlconnection

我看过很多主题相同的帖子。 但是都没有帮助我。 我想在CrossPlatform-App中使用Postgresql。稍后,我将在云中使用服务器,但为进行尝试,我认为使用本地数据库会更容易。 因此,我已经安装了数据库本身和带有“ NuGet”的“ npgsql”软件包,就像Postgres专家推荐的那样。在连接时总是出现相同的错误后,我将代码缩减为一个包含十行代码的console-App。

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 Framework尝试使用SQL Server而不是将我的String传递给npgsql驱动程序。因此,从字符串中剪切“端口”是没有意义的。

我的问题是如何将字符串解析更改为Progresql提供程序?主动地我没有为该错误选择做任何事情,这显然是.Net Framework默认行为的一部分,或者是错误或打算仅支持MS产品。

我尝试了一些改变行为的方法。 为澄清起见,:因为我不接受使用“ NpgsqlConnection”。我的代码应独立于提供程序。

就像我在Postgresql-Docu中找到npgsql并遇到另一个具有相同问题的question一样,我在Console-App的App.Config文件中添加了以下几行。

<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和应用程序配置的一些信息。但是我找不到有用的信息,主要是因为不知道如何搜索。因此,任何帮助对我都是有用的。预先感谢。

2 个答案:

答案 0 :(得分:0)

这是入门的基本代码。但是,对于初学者来说,最好的方法就是浏览教程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();
}

答案 1 :(得分:0)

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本身中修复所有特定于实现的细节。