C#使用Npgsql或SqlClient连接数据库

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 在C#使用Npgsql和SqlClient连接SQLserver、pgsql

目录

SqlClient连接SQL Server

安装SqlClient

SqlConnection

SqlCommand

SqlConnection 和 SqlCommand的区别

Npgsql连接PostgreSQL

安装Npgsql

pgsql设置自增

insert

select

使用DataReader查询

通过下标获取数据

使用DataAdapter查询

总结


SqlClient连接SQL Server

安装SqlClient

在vs或rider的nuget包管理器直接下载。nuget包System.Data.SqlClient,SqlClient 是 Microsoft 提供的一种用于连接 SQL Server 和其他关系型数据库的类库。

image.gif

SqlConnection

using System.Data.SqlClient;
string connectionString = "Server=myServerAddress;Database=myDatabase;User Id=myUsername;Password=myPassword;";  
using (SqlConnection connection = new SqlConnection(connectionString))  
{
    connection.Open();  
    // 进行数据库操作  
    connection.Close();  
}

image.gif

在上面的代码中,你需要将 "myServerAddress" 替换为 SQL Server 数据库服务器的 IP 地址或主机名,将 "myDatabase" 替换为要连接的数据库名称,将 "myUsername" 和 "myPassword" 替换为数据库用户的用户名和密码。

SqlCommand

除了 SqlConnection 对象,你还可以使用 SqlCommand 对象连接到 SQL Server 数据库,并执行 SQL 查询操作。以下是使用 SqlCommand 对象连接 SQL Server 数据库的示例代码:

using System.Data.SqlClient;
string connectionString = "Server=myServerAddress;Database=myDatabase;User Id=myUsername;Password=myPassword;";  
using (SqlConnection connection = new SqlConnection(connectionString))  
{
    connection.Open();  
    using (SqlCommand command = new SqlCommand("SELECT * FROM myTable", connection))  
    {  
        command.ExecuteReader();  
        // 进行数据库操作  
    }  
    connection.Close();  
}

image.gif

在上面的代码中,你需要将 "myServerAddress" 替换为 SQL Server 数据库服务器的 IP 地址或主机名,将 "myDatabase" 替换为要连接的数据库名称,将 "myUsername" 和 "myPassword" 替换为数据库用户的用户名和密码。

SqlConnection 和 SqlCommand的区别

SqlConnection 和 SqlCommand 是 SqlClient 类库中用于连接和操作关系型数据库的两个重要对象,它们有以下区别:

    1. 连接对象:SqlConnection 是一个连接数据库的对象,它用于建立与数据库的连接,并可以在连接状态下执行 SQL 语句。SqlCommand 是用于执行 SQL 语句的对象,它需要包含 SQL 语句和连接对象的信息,可以在连接状态下执行 SQL 语句,也可以单独使用。
    2. SQL 语句:SqlCommand 对象可以执行 SQL 语句,它可以包含任意的 SQL 语句,例如 SELECT、INSERT、UPDATE 或 DELETE 等操作。而 SqlConnection 对象只能用于执行 SQL 语句,它不能执行其他操作。
    3. 连接状态:SqlCommand 对象需要包含连接对象的信息,才能在连接状态下执行 SQL 语句。而 SqlConnection 对象可以在连接状态下执行 SQL 语句,也可以单独使用。
    4. 执行方式:SqlCommand 对象可以异步执行,可以在等待 SQL 语句执行完成的同时继续执行其他操作。而 SqlConnection 对象只能同步执行,必须在代码块内等待 SQL 语句执行完成才能继续执行其他操作。

    总的来说,SqlConnection 对象主要用于建立和执行 SQL 语句,而 SqlCommand 对象则更加灵活,可以执行任意的 SQL 语句。


    Npgsql连接PostgreSQL

    查阅资料说SqlClient 类库可以用于连接多种关系型数据库,包括 SQL Server、MySQL、Oracle、PostgreSQL 等

    试了一下

    using System.Data.SqlClient;
    SqlConnection connection = new SqlConnection ("Server= 127.0.0.1;Database=study;User Id=postgres;Password=1qazZAQ!;");
    connection.Open();

    image.gif

    不知道哪里写错了,在Open的时候报错了,于是换成Npgsql

    安装Npgsql

    image.gif

    using Npgsql;
     string connString = "Host=localhost;Port=5432;Username=postgres;Password=1qazZAQ!;Database=study";
     var conn = new NpgsqlConnection(connString);
     conn.Open();

    image.gif

    打印一下状态

    Console.WriteLine(conn.State);

    image.gif

    成功!

    接下来我们使用连接做一些操作,首先打开数据库可视化工具创建一个表,

    image.gif

    pgsql设置自增

    这里插叙一下,pgSQL比MySQL设置自增要稍微麻烦一点

    在navicat中,mysql可以直接勾选选项就能设置自增

    image.gif

    而pgsql的话,点击其他,选择序列,然后新建序列

    image.gif

    image.gif

    所有者:表的库名

    递增、当前值、开始值、最大小值

    缓存:指定数据库预先分配序列的值供快速访问,意思就是可以提前提供一些自增至,比如:我现在想在id字段下面设置自增,把缓存设置为20,在我下次新增数据的时候,id会自增到2,但是这个2其实已经生成过了,不会现在生成,节约一部分数据库压力。

    循环:是说当自增值超过最大值设定的时候,会重新从最小值开始;如果不设置循环,超过的时候就会报错。

    然后保存序列,记住保存的名称,如我这里保存为pg_test

    image.gif

    回到刚刚的设计表

    image.gif

    点击id行,默认中输入 nextval('pg_test'::regclass),pg_test换成你刚刚设置的名称,自此,pgsql的自增id就设置好了

    insert

    using Npgsql;
    string connString = "Host=localhost;Port=5432;Username=postgres;Password=1qazZAQ!;Database=study";
    using (NpgsqlConnection conn = new NpgsqlConnection(connString))
    {
        conn.Open();
        string sql = "INSERT INTO  user1 ( name,age) values ('小明',3)";
        using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
        {
            command.ExecuteNonQuery();    
        }
    }

    image.gif

    执行两次,打开navicat,可以看见数据库已经增加了数据,并且id有自增

    image.gif

    至于为什么我的id第一个是9,因为我刚刚执行了很多次然后又清空了表,如果重置自增,回到刚刚设置自增的地方,把当前的值恢复为1就好了

    image.gif

    select

    使用DataReader查询

    还是连接刚刚的数据库

    string connString = "Host=localhost;Port=5432;Username=postgres;Password=1qazZAQ!;Database=study";
    using NpgsqlConnection conn = new NpgsqlConnection(connString);
    conn.Open();

    image.gif

    通过下标获取数据

    using NpgsqlCommand command = new NpgsqlCommand("select * from user1", conn);
    var npgsqlDataReader = command.ExecuteReader();
    while (npgsqlDataReader.Read())
    {
         var student = new Student(
              npgsqlDataReader.GetInt32(0),
              npgsqlDataReader.GetString(1),
              npgsqlDataReader.GetInt32(2)
         );
         Console.WriteLine(student.Id + student.Name + student.Age);
    }
    record Student(int Id, string Name, int Age);

    image.gif

    image.gif

    image.gif

    通过字段名获取获取

    using NpgsqlCommand command = new NpgsqlCommand("select * from user1", conn);
    var npgsqlDataReader = command.ExecuteReader();
    while (npgsqlDataReader.Read())
    {
         Console.WriteLine(npgsqlDataReader["id"].ToString()+npgsqlDataReader["name"]+npgsqlDataReader["age"]);
    }

    image.gif

    image.gif

    效果是一样的

    使用DataAdapter查询

    DataAdapter和DataReader不同之处,DataAdapter数据拿到之后就会自动断开连接,把数据存到内存里

    string connString = "Host=localhost;Port=5432;Username=postgres;Password=1qazZAQ!;Database=study";
    using NpgsqlConnection conn = new NpgsqlConnection(connString);

    image.gif

    读取数据到内存中,可以使用dataset或datatable来存储

    var npgsqlDataAdapter = new NpgsqlDataAdapter();
    npgsqlDataAdapter.SelectCommand = new NpgsqlCommand("select * from user1",conn);
    // var dataSet = new DataSet();
    // npgsqlDataAdapter.Fill(dataSet);//将数据填充到dataSet
    var dataTable = new DataTable();
    npgsqlDataAdapter.Fill(dataTable);//将数据填充到dataTable
    foreach (DataRow dataTableRow in dataTable.Rows)
    {
        Console.WriteLine(dataTableRow["id"]+(string)dataTableRow["name"]+dataTableRow["age"]);
    }

    image.gif

    image.gif

    dataTable转list

    List<student> list = new List<student>();
    foreach (DataRow dataTableRow in dataTable.Rows)
    {
        student student = new student(
            (int)dataTableRow["id"],
            (string)dataTableRow["name"],
            (int)dataTableRow["age"]
        );
        list.Add(student);
    }
    foreach (var student1 in list)
    {
        Console.WriteLine(student1);
    }
    record student(int Id, string Name, int Age);

    image.gif

    image.gif

    总结

    Command 是用于执行 SQL 查询或更新命令的对象,它可以包含一个或多个参数,用于传递数据给数据库。使用 Command 对象可以执行查询或更新操作,并返回结果集。

    DataAdapter 是用于连接数据源 (如数据库) 和数据控件 (如数据表格) 的对象,它可以根据 Command 对象执行 SQL 查询或更新操作,并将结果集绑定到数据控件中。

    DataReader 是用于读取数据集的对象,它可以读取已经执行了查询操作的数据,并将其绑定到数据控件中。DataReader 对象不适合执行复杂的查询操作,因为它只能读取已经执行了查询操作的结果集。

    在使用这三个对象之前,通常需要先使用 Connection 对象连接数据库。Connection 对象用于管理数据库连接,它可以打开或关闭数据库连接,并执行连接、断开连接或更新数据库操作。只有在连接数据库成功后,才可以使用 Command、DataAdapter 和 DataReader 对象进行查询、更新或读取数据的操作。

    通俗来讲,就是:

    Connection 连接数据库,然后Command 执行sql语句,如果是插入、更新和删除操作不需要返回结果集,这种不需要返回值的就不需要使用DataAdapter 类,而像查询操作通常需要返回结果集,因此需要使用 DataAdapter 对象将结果集绑定到数据控件上

    相关实践学习
    使用PolarDB和ECS搭建门户网站
    本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
    阿里云数据库产品家族及特性
    阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
    目录
    相关文章
    |
    1月前
    |
    SQL 开发框架 .NET
    ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
    随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
    169 3
    |
    23天前
    |
    关系型数据库 MySQL 数据库连接
    python脚本:连接数据库,检查直播流是否可用
    【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
    122 68
    |
    19天前
    |
    SQL Java 数据库连接
    在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
    在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
    32 3
    |
    26天前
    |
    关系型数据库 MySQL 数据库连接
    DBeaver如何连接一个数据库
    【10月更文挑战第27天】DBeaver 是一款功能强大的通用数据库管理工具,支持多种主流数据库。本文介绍了使用 DBeaver 连接数据库的基本步骤,包括下载安装、创建新连接、选择数据库类型、配置连接参数、测试连接以及最终连接到数据库。详细的操作指南帮助用户轻松管理和操作数据库。
    132 9
    |
    19天前
    |
    Java 数据库连接 数据库
    深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
    在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
    19 1
    |
    19天前
    |
    Java 数据库连接 数据库
    Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
    本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
    33 1
    |
    28天前
    |
    SQL JavaScript 关系型数据库
    node博客小项目:接口开发、连接mysql数据库
    【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
    |
    1月前
    |
    Java 关系型数据库 MySQL
    springboot学习五:springboot整合Mybatis 连接 mysql数据库
    这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
    75 0
    springboot学习五:springboot整合Mybatis 连接 mysql数据库
    |
    22天前
    |
    SQL 关系型数据库 数据库连接
    "Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
    【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
    48 0
    |
    1月前
    |
    SQL 存储 监控
    串口调试助手连接SQL数据库的技巧与方法
    串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析