C# PostgreSQL 教程-程序员宅基地

技术标签: postgresql  

C# PostgreSQL 教程展示了如何在 C# 中对 PostgreSQL 进行编程。它涵盖了使用 C# 进行 PostgreSQL 编程的基础知识。 C# 教程是关于 C# 语言的综合教程。

PostgreSQL

PostgreSQL 是一个功能强大的开源对象关系数据库系统。它是一个多用户数据库管理系统。它可以在多个平台上运行,包括 Linux、FreeBSD、Solaris、Microsoft Windows 和 Mac OS X。PostgreSQL 由 PostgreSQL Global Development Group 开发。

PostgreSQL 具有复杂的功能,例如多版本并发控制 (MVCC)、时间点恢复、表空间、异步复制、嵌套事务(保存点)、在线/热备份、复杂的查询计划器/优化器以及用于容错的预写日志记录. 它支持国际字符集、多字节字符编码、Unicode,并且它对排序、区分大小写和格式化具有区域感知能力。

ADO.NET

ADO.NET是 .NET 框架的重要组成部分。它是一种统一对关系数据库、XML 文件和其他应用程序数据的访问的规范。 Npgsql是 PostgreSQL 数据库的 ADO.NET 规范的实现。它是用 C# 语言编写的驱动程序,适用于所有 .NET 语言。

$ dotnet add package Npgsql

我们将包包含到我们的 .NET Core 项目中。

NpgsqlConnectionNpgsqlCommand、 NpgsqlDataReader和是 .NET 数据提供者模型的核心元素DataSet。 创建与特定数据源的连接NpgsqlDataProviderNpgsqlConnectionNpgsqlCommand对象针对数据源执行 SQL 语句。从NpgsqlDataReader数据源读取数据流。

DataSet对象用于处理大量数据的离线工作。它是一种不连贯的数据表示,可以保存来自各种不同来源的数据。两者NpgsqlDataReaderDataSet 用于处理数据;它们在不同的情况下使用。如果我们只需要读取查询的结果,那NpgsqlDataReader是更好的选择。如果我们需要更广泛的数据处理,或者我们想要将 Winforms 控件绑定到数据库表,DataSet则首选。

C# PostgreSQL 版本

如果下面的程序我们检查PostgreSQL服务器的版本。

程序.cs
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

C# PostgreSQL 创建表

在下面的示例中,我们创建一个数据库表并用数据填充它。

程序.cs
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 DROPINSERTDELETE 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已成功创建。

C# PostgreSQL 准备好的语句

准备好的语句提高了安全性和性能。当我们编写准备好的语句时,我们使用占位符而不是直接将值写入语句。

程序.cs
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 注入攻击。@nameand是占位符,@price 稍后会填充。

cmd.Parameters.AddWithValue("name", "BMW");
cmd.Parameters.AddWithValue("price", 36600);
cmd.Prepare();

使用该方法将值绑定到占位符AddWithValue

cmd.ExecuteNonQuery();

准备好的语句被执行。当我们不期望返回任何数据时, 我们使用对象的ExecuteNonQuery 方法。NpgsqlCommand

C# NpgsqlDataReader

NpgsqlDataReader是用于从数据库中检索数据的对象 。它提供对查询结果的快速、只进、只读访问。这是从表中检索数据的最有效方式。

程序.cs
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

C# PostgreSQL 列标题

在以下示例中,我们使用数据库表中的数据打印列标题。

程序.cs
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}");

我们使用GetNamereader 的方法获取列的名称。

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 数据库进行编程。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/allway2/article/details/124247624

智能推荐

linux gcc-c++等依赖安装以及防火墙基础命令_gcc-c++安装包-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏7次。linux gcc-c++等依赖安装以及防火墙基础命令_gcc-c++安装包

sybase安装字符集_sybase12.5添加字符集-程序员宅基地

文章浏览阅读1.6k次。我是在windows环境下安装了一个sybase数据库。1、找到要安装的字符集目录D:\ProgramFiles\sybase12.5\charsets\cp850 ,这个目录是在sybaes的安装目录;sybae默认不会安装所有的字符集,如果你需要的字符集数据库没有安装的话;可以自行进行安装。在cp850同级目录还有许多的其他字符集。2_sybase12.5添加字符集

一文了解路由平台的 Cisco IOS 和 IOS XE 命名约定,看这篇就够了_ios xe system 在哪些设备-程序员宅基地

文章浏览阅读4.9k次。文章目录概述命名约定一致性IOSCisco IOS XE 软件版本 16 和 17IOS XE 软件版本 3SIOS XE Train 标识符物理平台虚拟平台IOS经典Cisco IOS 软件版本 15IOS 经典列车标识符物理平台概述命名约定一致性对某事物进行任何命名约定的全部意义在于使事物保持一致和统一。遵守约定可为专业人员提供基本规则,让他们坚持已知的内容,为现在和未来的员工以及使用思科产品的人员提供清晰简洁的信息。本文概述了Cisco 路由平台的 Cisco IOS 命名约定,包括 IOS _ios xe system 在哪些设备

Nginx反向代理L4后进行keepalived检测_l4的代理-程序员宅基地

文章浏览阅读442次。1、10和11上安装nginx代理12和13和keepalived并配置yum install nginx keepalived -yvim /etc/nginx/nginx.conf末尾添加stream { upstream kube-apiserver { server 10.4.7.12:6443 max_fails=3 fail_timeout=30..._l4的代理

Java后台获取小程序用户信息和登录_java 小程序 后端获得userinfo 2024-程序员宅基地

文章浏览阅读2.1k次。登录请求体public class MiniProgramLoginCommand { private String jsCode; private String encryptedData; private String iv;}核心代码private static final Logger logger = LoggerFactory.getLogger(XX..._java 小程序 后端获得userinfo 2024

HDFS(12)--HDFS的javaAPI操作_java hdfs api filesystem exists-程序员宅基地

文章浏览阅读1.9k次。创建maven工程并导入jar包<repositories><repository><id>cloudera</id><url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>&..._java hdfs api filesystem exists

随便推点

【转载】WPF自定义控件与样式(1)-矢量字体图标(iconfont)_/k.framework.controls;component/resources/#sf2015-程序员宅基地

文章浏览阅读1.4k次。原文地址:http://www.cnblogs.com/anding/p/4961215.html一.图标字体  图标字体在网页开发上运用非常广泛,具体可以网络搜索了解,网页上的运用有很多例子,如Bootstrap。但在C/S程序中使用还不多,字体图标其实就是把矢量图形打包到字体文件里,就像使用一般外置字体一样的使用,因此Winform、WPF中都是可以用的。  在我们多个_/k.framework.controls;component/resources/#sf2015

k8s gcr.io/google-samples/hello-frontend:1.0 镜像无法下载_docker pull gcr.io/google-samples/node-hello:1.0-程序员宅基地

文章浏览阅读2.5k次。Failed to pull image "gcr.io/google-samples/hello-frontend:1.0": rpc error: code = Unknown desc = Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for conne..._docker pull gcr.io/google-samples/node-hello:1.0

vector数组的初始化_vector数组初始化-程序员宅基地

文章浏览阅读2.2k次。1.已知元素的初始化vector a={1,2,3,4,5};2.需要输入元素的初始化(1)先将vector中所有元素初始化为0vector a(n)或vector a(n,0)#include<iostream>#include<vector>using namespace std;int main(){ int n; cin >&..._vector数组初始化

二级c语言105道上机题库,微机原理及应用习题105道-程序员宅基地

文章浏览阅读5.3k次。《微机原理与应用》习题1. 求ADDRI开始单元中连续存放的两个双字数据之和,将结果存放在ADDR2开始的单元,并将结果在显示器上显示出来。(假定和不超过双字) 2. 在一个首地址为STR、长度为N的字符串中查找“空格”,找到则向DL中送1,否则向DL中送-1。 3. 将两位十六进制数转换成ASCII码,并送屏幕显示,要求使用顺序结构实现。 4. 使用分支结构实现将1位十六进制数转换成ASCII码..._自1000h单元开始有1000个单字节带符号数

python fabric2.X版本-程序员宅基地

文章浏览阅读998次。2019独角兽企业重金招聘Python工程师标准>>> ..._python通过fabric2可以用rsync吗

DAO设计模式_dao设计模式最广泛-程序员宅基地

文章浏览阅读278次。DAO (Data Access Object,数据访问对象)的主要功能是数据操作,提供多个原子性的DAO操作,如增加、修改、删除等,都于原子性的操作。DAO主要由以下几个部分组成:1.DatabaseConnection:专门负责数据库的打开与关闭操作的类。2.VO:主要由属性、setter、getter方法组成3.DAO:主要定义操作的接口,定义一系列数据库的原子性操_dao设计模式最广泛