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

2023-11-14

目录

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 和其他关系型数据库的类库。

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();  
}

在上面的代码中,你需要将 "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();  
}

在上面的代码中,你需要将 "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();

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

安装Npgsql

using Npgsql;

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

打印一下状态

Console.WriteLine(conn.State);

成功!

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

pgsql设置自增 

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

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

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

 

所有者:表的库名

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

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

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

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

 回到刚刚的设计表

点击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();    
    }
}

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

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

select

使用DataReader查询

 还是连接刚刚的数据库

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

通过下标获取数据

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);

 

 通过字段名获取获取

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"]);
}

 效果是一样的

使用DataAdapter查询

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

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

读取数据到内存中,可以使用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"]);
}

 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);

 

总结

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

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

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

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

通俗来讲,就是:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#使用Npgsql或SqlClient连接数据库 的相关文章

随机推荐

  • 共享单车项目数据可视化+需求策略分析

    一 项目背景 自行车共享系统是一种租赁自行车的方式 其中获得会员资格 租赁和归还自行车的过程是通过遍布城市的站点网络自动完成的 使用这些系统 人们可以从一个地方租用自行车 并根据需要将其归还到另一个地方 共享单车是近年来流行起来的新兴产业
  • MOS管参数每一个参数详解-收藏版

    MOS管参数 在使用MOS管设计开关电源或者马达驱动的时候 一般都要考虑MOS的导通电阻 最大电压等 最大电流等因素 MOSFET是电压型驱动器材 驱动的进程即是栅极电压的建立进程 这是经过对栅源及栅漏之间的电容充电来完成的 下面将有此方面
  • PCB铜箔厚度单位盎司(OZ)的具体信息

    盎司 OZ 本身是一个重量单位 盎司和克 g 的换算公式为 1OZ 28 35g 在PCB行业中 1OZ意思是重量1OZ的铜均匀平铺在1平方英尺 FT2 的面积上所达到的厚度 它是用单位面积的重量来表示铜箔的平均厚度 用公式来表示即 1OZ
  • Java基础篇——面向对象编程

    活动地址 CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸 早一天就多一份人生的精彩 迟一天就多一天平庸的困扰 各位小伙伴 如果您 想系统 深入学习某技术知识点 一个人摸索学习很难坚持 想组团高效学习 想写博客但无从下手 急需写作干货注
  • npm 切换源_nrm:npm包管理工具

    一 简介 nrm npm registry manager 是npm的镜像源管理工具 可以方便的更换npm的包源 可解决问题 1 更换国内镜像包源 如淘宝npm镜像 解决国内npm国外包慢的问题 2 更换某些内网独立包源 实现安装内网独立的
  • 「技术综述」人脸妆造迁移核心技术总结

    2020 07 10 12 02 36 美颜和美妆是人脸中很常见的技术 在网络直播以及平常的社交生活中都有很多应用场景 常见的如磨皮 美白 塑形等美颜技术我们已经比较熟悉了 而本文重点介绍的是人脸妆造迁移的核心技术及其相关资源 作者 编辑
  • Spring框架详解(二)

    一 IOC基本原理 1 什么是IOC容器 容器 容器是一种为特定组件的运行提供必要支持的一个软件环境 例如Tomcat就是一个Servlet容器 它可以为Servlet的运行提供运行环境 类似Docker这样的软件也是一个容器 它提供了必要
  • 由于找不到msvcp120.dll无法执行此代码的解决方法

    电脑系统中的msvcp120 dll文件如果丢失或者损坏 那么会有很多游戏跟软件就会出现无法打开运行的情况 msvcp120 dll是Windows系统动态连接组件中非常重要的文件 小编今天就把修复教程分享给大家 修复方法如下 首先是打开电
  • gradle 查看依赖类库版本_如何查找第三方库(Gradle引用)的依赖?

    答 三种方法查找 1 执行 Gradle Task androidDependencies 可以直接执行 gradle androidDependencies 执行结果将在控制台直接输出 可以在控制台直接查看 但是如果依赖很多的时候 控制无
  • BeanUtils.copyProperties()和JSONObject.parseObject()分别是哪种拷贝类型(浅拷贝 or 深拷贝)

    目录 一 结论 二 证明BeanUtils copyProperties 是浅拷贝 三 证明JSONObject parseObject 是深拷贝 四 总结 一 结论 BeanUtils copyProperties 浅拷贝 JSONObj
  • Python爬虫之Js逆向案例(17)- Scrapy JD版店铺详情|问答

    本案例是案例 16 的Scrapy版本 一次运行程序 同时获取内容 获取商店详情 商品问题 商品答案 效果如下图 一 Scrapy框架从安装到运行的过程 1 安装scrapy框架 控制台输入 pip3 install scrapy 2 验证
  • Nominatim/Installation

    原文地址 http wiki openstreetmap org wiki Nominatim Installation 本文介绍的是针对Nominatim 2 5 x版本的安装方法 软件下载地址 http www nominatim or
  • 双击计算机文档,电脑双击文件都是打开属性窗口怎么办

    电脑双击文件都是打开属性窗口怎么办 电脑双击文件都是打开属性窗口怎么办 不知道电脑怎么回事 双击文件后显示的都是属性窗口 该怎么办呢 下面小编分享电脑鼠标双击文件都是打开属性窗口的解决办法 欢迎大家前来阅读 电脑双击文件都是打开属性窗口怎么
  • 实现token

    每天一篇之token实现 现在web开发基本上都会涉及到token 至于为什么要用这些就不再解释 就默默发一个token的util 下面是代码 import com auth0 jwt JWT import com auth0 jwt JW
  • android EasyLink给wifi模块配网

    相关文章 博客 http blog csdn net u010924834 article details 49491349 本文使用的是庆科wifi模块 http developer mico io downloads 庆科的开发者地址
  • Windbg查找单例对象

    在程序的达到一定规模之后 就会用到比较多的管理类 这种管理类多采用单例模式 在问题排查过程中往往需要看下管理类里面的某些状态是否符合预期 但是崩溃的堆栈在当前局部变量中并 无该单例的相关引用 单例的实现上是将一个实例化对象保存在静态变量中
  • 网关和IP地址不在同一个网段下

    海外的客户报告了一个问题 设备设置的网关地址不在设备所在的网段下面 例如 IP 192 168 135 2 NetMask 255 255 255 0 GateWay 192 168 8 1 现在的问题来了 设备能不能PING通网关 这个问
  • 解决vue 路由传参后退参数丢失的问题

    文章目录 业务需求 遇到问题 解决方案 利用localStorage 使用keep alive 业务需求 从A页面传参跳转B页面 B页面传参跳转C页面 C页面可以返回B页面 遇到问题 当C页面返回B页面时 由于B页面参数丢失导致页面渲染失败
  • Python爬虫逆向之加速乐

    先上链接 aHR0cHM6Ly93d3cubWlpdC5nb3YuY24v 网站分析 发现发起三次请求 第一次 状态码521 Set Cookie了一个jsluid 第二次 状态码依然是521 但是cookie里面多了一个jsl clear
  • C#使用Npgsql或SqlClient连接数据库

    目录 SqlClient连接SQL Server 安装SqlClient SqlConnection SqlCommand SqlConnection 和 SqlCommand的区别 Npgsql连接PostgreSQL 安装Npgsql