我看过很多主题相同的帖子。 但是都没有帮助我。 我想在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和应用程序配置的一些信息。但是我找不到有用的信息,主要是因为不知道如何搜索。因此,任何帮助对我都是有用的。预先感谢。
答案 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本身中修复所有特定于实现的细节。