C# PostgreSQL 教程展示了如何在 C# 中对 PostgreSQL 进行编程。它涵盖了使用 C# 进行 PostgreSQL 编程的基础知识。 C# 教程是关于 C# 语言的综合教程。
PostgreSQL 是一个功能强大的开源对象关系数据库系统。它是一个多用户数据库管理系统。它可以在多个平台上运行,包括 Linux、FreeBSD、Solaris、Microsoft Windows 和 Mac OS X。PostgreSQL 由 PostgreSQL Global Development Group 开发。
PostgreSQL 具有复杂的功能,例如多版本并发控制 (MVCC)、时间点恢复、表空间、异步复制、嵌套事务(保存点)、在线/热备份、复杂的查询计划器/优化器以及用于容错的预写日志记录. 它支持国际字符集、多字节字符编码、Unicode,并且它对排序、区分大小写和格式化具有区域感知能力。
ADO.NET是 .NET 框架的重要组成部分。它是一种统一对关系数据库、XML 文件和其他应用程序数据的访问的规范。 Npgsql是 PostgreSQL 数据库的 ADO.NET 规范的实现。它是用 C# 语言编写的驱动程序,适用于所有 .NET 语言。
$ dotnet add package Npgsql
我们将包包含到我们的 .NET Core 项目中。
、NpgsqlConnection
、NpgsqlCommand
、 NpgsqlDataReader
和是 .NET 数据提供者模型的核心元素DataSet
。 创建与特定数据源的连接NpgsqlDataProvider
。NpgsqlConnection
该NpgsqlCommand
对象针对数据源执行 SQL 语句。从NpgsqlDataReader
数据源读取数据流。
该DataSet
对象用于处理大量数据的离线工作。它是一种不连贯的数据表示,可以保存来自各种不同来源的数据。两者NpgsqlDataReader
都DataSet
用于处理数据;它们在不同的情况下使用。如果我们只需要读取查询的结果,那NpgsqlDataReader
是更好的选择。如果我们需要更广泛的数据处理,或者我们想要将 Winforms 控件绑定到数据库表,DataSet
则首选。
如果下面的程序我们检查PostgreSQL服务器的版本。
using Npgsql;
var cs = "Host=localhost;Username=postgres;Password=s$cret;Database=testdb";
using var con = new NpgsqlConnection(cs);
con.Open();
var sql = "SELECT version()";
using var cmd = new NpgsqlCommand(sql, con);
var version = cmd.ExecuteScalar().ToString();
Console.WriteLine($"PostgreSQL version: {version}");
我们连接到数据库并获取有关 PostgreSQL 服务器的一些信息。
using Npgsql;
我们导入 PostgreSQL 数据提供者的元素。
var cs = "Host=localhost;Username=postgres;Password=s$cret;Database=testdb";
这是连接字符串。数据提供者使用它来建立与数据库的连接。我们指定主机名、用户名、密码和数据库名。
using var con = new NpgsqlConnection(cs);
创建了一个NpgsqlConnection
对象。此对象用于打开与数据库的连接。using
当变量超出范围时, 该语句释放数据库连接资源。
con.Open();
此行打开数据库连接。
var sql = "SELECT version()";
这是 SQL SELECT 语句。它返回数据库的版本。这 version
是一个内置的 PostgreSQL 函数。
using var cmd = new NpgsqlCommand(sql, con);
这NpgsqlCommand
是一个用于在数据库上执行查询的对象。参数是 SQL 语句和连接对象。
var version = cmd.ExecuteScalar().ToString();
有些查询只返回一个标量值。在我们的例子中,我们需要一个简单的字符串来指定数据库的版本。在这种 ExecuteScalar
情况下使用。
Console.WriteLine($"PostgreSQL version: {version}");
我们将 PostgreSQL 的版本打印到控制台。
$ dotnet run
PostgreSQL version: PostgreSQL 11.1, compiled by Visual C++ build 1914, 64-bit
在下面的示例中,我们创建一个数据库表并用数据填充它。
using Npgsql;
var cs = "Host=localhost;Username=postgres;Password=s$cret;Database=testdb";
using var con = new NpgsqlConnection(cs);
con.Open();
using var cmd = new NpgsqlCommand();
cmd.Connection = con;
cmd.CommandText = "DROP TABLE IF EXISTS cars";
cmd.ExecuteNonQuery();
cmd.CommandText = @"CREATE TABLE cars(id SERIAL PRIMARY KEY,
name VARCHAR(255), price INT)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Audi',52642)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Mercedes',57127)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Skoda',9000)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Volvo',29000)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Bentley',350000)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Citroen',21000)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Hummer',41400)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Volkswagen',21600)";
cmd.ExecuteNonQuery();
Console.WriteLine("Table cars created");
在示例中,我们创建了一个cars
包含八行的表。
cmd.CommandText = "DROP TABLE IF EXISTS cars";
cmd.ExecuteNonQuery();
首先,如果表已经存在,我们将其删除。ExecuteNonQuery
如果我们不想要结果集,例如 for DROP
、INSERT
或DELETE
statements ,我们将使用该 方法。
cmd.CommandText = @"CREATE TABLE cars(id SERIAL PRIMARY KEY,
name VARCHAR(255), price INT)";
cmd.ExecuteNonQuery();
表cars
已创建。该SERIAL
关键字使列在 PostgreSQL 中自动递增。
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Audi',52642)";
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO cars(name, price) VALUES('Mercedes',57127)";
cmd.ExecuteNonQuery();
...
这里我们在表中插入两行。
$ dotnet run
Table cars created
我们运行程序。
$ psql -U postgres testdb
psql (11.1)
Type "help" for help.
psql
我们使用该工具 连接到 PostgreSQL 服务器。
testdb=# SELECT * FROM cars;
id | name | price
----+------------+--------
1 | Audi | 52642
2 | Mercedes | 57127
3 | Skoda | 9000
4 | Volvo | 29000
5 | Bentley | 350000
6 | Citroen | 21000
7 | Hummer | 41400
8 | Volkswagen | 21600
(10 rows)
我们验证数据。表cars
已成功创建。
准备好的语句提高了安全性和性能。当我们编写准备好的语句时,我们使用占位符而不是直接将值写入语句。
using Npgsql;
var cs = "Host=localhost;Username=postgres;Password=s$cret;Database=testdb";
using var con = new NpgsqlConnection(cs);
con.Open();
var sql = "INSERT INTO cars(name, price) VALUES(@name, @price)";
using var cmd = new NpgsqlCommand(sql, con);
cmd.Parameters.AddWithValue("name", "BMW");
cmd.Parameters.AddWithValue("price", 36600);
cmd.Prepare();
cmd.ExecuteNonQuery();
Console.WriteLine("row inserted");
cars
我们在桌子上 添加了一辆新车。我们使用参数化命令。
var sql = "INSERT INTO cars(name, price) VALUES(@name, @price)";
using var cmd = new NpgsqlCommand(sql, con);
当我们编写准备好的语句时,我们使用占位符而不是直接将值写入语句。准备好的语句速度更快,可以防止 SQL 注入攻击。@name
and是占位符,@price
稍后会填充。
cmd.Parameters.AddWithValue("name", "BMW");
cmd.Parameters.AddWithValue("price", 36600);
cmd.Prepare();
使用该方法将值绑定到占位符AddWithValue
。
cmd.ExecuteNonQuery();
准备好的语句被执行。当我们不期望返回任何数据时, 我们使用对象的ExecuteNonQuery
方法。NpgsqlCommand
NpgsqlDataReader
是用于从数据库中检索数据的对象 。它提供对查询结果的快速、只进、只读访问。这是从表中检索数据的最有效方式。
using Npgsql;
var cs = "Host=localhost;Username=postgres;Password=s$cret;Database=testdb";
using var con = new NpgsqlConnection(cs);
con.Open();
string sql = "SELECT * FROM cars";
using var cmd = new NpgsqlCommand(sql, con);
using NpgsqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine("{0} {1} {2}", rdr.GetInt32(0), rdr.GetString(1),
rdr.GetInt32(2));
}
我们从cars
表中获取所有行并将它们打印到控制台。
using NpgsqlDataReader rdr = cmd.ExecuteReader();
要创建NpgsqlDataReader
,我们调用对象的 ExecuteReader
方法NpgsqlCommand
。
while (rdr.Read())
{
Console.WriteLine("{0} {1} {2}", rdr.GetInt32(0), rdr.GetString(1),
rdr.GetInt32(2));
}
该Read
方法使数据读取器前进到下一条记录。true
如果有更多行,则返回;否则false
。我们可以使用数组索引表示法检索值,或使用特定方法访问其本机数据类型中的列值。后者效率更高。
$ dotnet run
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000
6 Citroen 21000
7 Hummer 41400
8 Volkswagen 21600
9 BMW 36600
在以下示例中,我们使用数据库表中的数据打印列标题。
using Npgsql;
var cs = "Host=localhost;Username=postgres;Password=s$cret;Database=testdb";
using var con = new NpgsqlConnection(cs);
con.Open();
var sql = "SELECT * FROM cars";
using var cmd = new NpgsqlCommand(sql, con);
using NpgsqlDataReader rdr = cmd.ExecuteReader();
Console.WriteLine($"{rdr.GetName(0),-4} {rdr.GetName(1),-10} {rdr.GetName(2),10}");
while (rdr.Read())
{
Console.WriteLine($"{rdr.GetInt32(0),-4} {rdr.GetString(1),-10} {rdr.GetInt32(2),10}");
}
在示例中,我们从cars
表中选择所有行及其列名。
Console.WriteLine($"{rdr.GetName(0),-4} {rdr.GetName(1),-10} {rdr.GetName(2),10}");
我们使用GetName
reader 的方法获取列的名称。
while (rdr.Read())
{
Console.WriteLine($"{rdr.GetInt32(0),-4} {rdr.GetString(1),-10} {rdr.GetInt32(2),10}");
}
我们将 SQL 语句返回的数据打印到终端。
$ dotnet run
id name price
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000
6 Citroen 21000
7 Hummer 41400
8 Volkswagen 21600
9 BMW 36600
在本教程中,我们展示了如何使用 C# 对 PostgreSQL 数据库进行编程。