技术标签: postgresql
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 数据库进行编程。
文章浏览阅读3.5k次,点赞2次,收藏7次。linux gcc-c++等依赖安装以及防火墙基础命令_gcc-c++安装包
文章浏览阅读1.6k次。我是在windows环境下安装了一个sybase数据库。1、找到要安装的字符集目录D:\ProgramFiles\sybase12.5\charsets\cp850 ,这个目录是在sybaes的安装目录;sybae默认不会安装所有的字符集,如果你需要的字符集数据库没有安装的话;可以自行进行安装。在cp850同级目录还有许多的其他字符集。2_sybase12.5添加字符集
文章浏览阅读4.9k次。文章目录概述命名约定一致性IOSCisco IOS XE 软件版本 16 和 17IOS XE 软件版本 3SIOS XE Train 标识符物理平台虚拟平台IOS经典Cisco IOS 软件版本 15IOS 经典列车标识符物理平台概述命名约定一致性对某事物进行任何命名约定的全部意义在于使事物保持一致和统一。遵守约定可为专业人员提供基本规则,让他们坚持已知的内容,为现在和未来的员工以及使用思科产品的人员提供清晰简洁的信息。本文概述了Cisco 路由平台的 Cisco IOS 命名约定,包括 IOS _ios xe system 在哪些设备
文章浏览阅读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的代理
文章浏览阅读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
文章浏览阅读1.9k次。创建maven工程并导入jar包<repositories><repository><id>cloudera</id><url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>&..._java hdfs api filesystem exists
文章浏览阅读1.4k次。原文地址:http://www.cnblogs.com/anding/p/4961215.html一.图标字体 图标字体在网页开发上运用非常广泛,具体可以网络搜索了解,网页上的运用有很多例子,如Bootstrap。但在C/S程序中使用还不多,字体图标其实就是把矢量图形打包到字体文件里,就像使用一般外置字体一样的使用,因此Winform、WPF中都是可以用的。 在我们多个_/k.framework.controls;component/resources/#sf2015
文章浏览阅读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
文章浏览阅读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数组初始化
文章浏览阅读5.3k次。《微机原理与应用》习题1. 求ADDRI开始单元中连续存放的两个双字数据之和,将结果存放在ADDR2开始的单元,并将结果在显示器上显示出来。(假定和不超过双字) 2. 在一个首地址为STR、长度为N的字符串中查找“空格”,找到则向DL中送1,否则向DL中送-1。 3. 将两位十六进制数转换成ASCII码,并送屏幕显示,要求使用顺序结构实现。 4. 使用分支结构实现将1位十六进制数转换成ASCII码..._自1000h单元开始有1000个单字节带符号数
文章浏览阅读998次。2019独角兽企业重金招聘Python工程师标准>>> ..._python通过fabric2可以用rsync吗
文章浏览阅读278次。DAO (Data Access Object,数据访问对象)的主要功能是数据操作,提供多个原子性的DAO操作,如增加、修改、删除等,都于原子性的操作。DAO主要由以下几个部分组成:1.DatabaseConnection:专门负责数据库的打开与关闭操作的类。2.VO:主要由属性、setter、getter方法组成3.DAO:主要定义操作的接口,定义一系列数据库的原子性操_dao设计模式最广泛