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

2023-11-18

目录

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连接数据库 的相关文章

  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 在 SQL Server 中获取一周的第一天

    我试图按周对记录进行分组 将聚合日期存储为一周的第一天 然而 我用于四舍五入日期的标准技术似乎无法在几周内正常工作 尽管它可以在天 月 年 季度和我应用的任何其他时间范围内正常工作 这是 SQL select start of week d
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其

随机推荐

  • 刷脸支付互联网思维的推广让传播变得更快

    行业巨头也在加速抢占刷脸支付的风口 支付宝近期发布了新的刷脸支付设备 同时宣布补贴力度不设上限 以此来加速刷脸支付的落地 在巨头们的大力推动下 刷脸支付普及率不断提升 最新数据显示 目前我国刷脸支付用户数已经破亿 其中 90后 占据了主流
  • Qt之软键盘的实现

    文章目录 前言 一 基于中文汉字数据库 1 核心代码 2 效果 二 基于谷歌拼音输入引擎 1 核心代码 2 效果 前言 Qt5 8版本开始推出了基于QML实现的软键盘功能 在此之前 并没有官方版本的软键盘 本篇主要介绍Qt实现软键盘的两种方
  • conda创建虚拟环境 python版本不对_如何在conda虚拟环境中指定python版本

    我在新的职位上负责一个工作项目 我相信虚拟环境是在它里面创造的 正如我所见 head bm3 py usr bin env opt bm3 venv bin python3 bm3 venv是使用requirements txt 使用vir
  • 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(二)之分库分表路由

    关注微信公众号 芋道源码 有福利 1 RocketMQ MyCAT Sharding JDBC 所有源码分析文章列表 2 RocketMQ MyCAT Sharding JDBC 中文注释源码 GitHub 地址 3 您对于源码的疑问每条留
  • c++学习之pair对组创建

    功能描述 成对出现的数据 利用队组可以反回两个数据 函数原型 pair
  • C# 项目没有.sln文件的解决办法:

    什么是sln文件 sln文件开发中使用的解决方案文件 使用解决方案文件 后缀为sln的文件 表示一个项目组 他通常包含一个项目中所有的工程文件信息 包括文件版本 工程信息 全局设置 通过打开sln文件就可以加载整个项目 但是我新建的一个项目
  • Win11总是出现BitLocker恢复,想要彻底关闭它该如何操作?

    win11解除bitlocker加密方法一 1 首先按下键盘 Win R 打开运行 如图所示 2 打开运行后 在其中输入 control 并点击 确定 打开控制面板 如图所示 3 打开后 进入 bitlocker驱动器加密 如图所示 4 随
  • 【计算机视觉

    文章目录 一 ResNeSt 二 ShuffleNet v2 三 FBNet 四 Inception v4 五 ResNet D 六 MetaFormer 七 PyramidNet 八 RevNet 九 Convolutional Visi
  • Shell脚本运行中的停止方法

    Linux系统Shell中提交了一个脚本 但是需要停止这个进程 如何处理 方式1 killall file flume kafka 说明 killall是一个命令 不是kill all file flume kafka是脚本名 此方法简单粗
  • C++ 发送http太慢导致数据积压问题分析(Linux)

    问题现象 程序接收数据 对数据进行简单地处理 处理完之后发送到其他平台 程序在接收到数据到在其他平台上面显示时间差了将近一个小时 存放要发送到其他平台的数据的容器积压了大概一百五十多万条的数据 问题排查过程 1 接收数据与发送数据到其他平台
  • 列出所有共享的文件夹权限或 NTFS 权限 (PowerShell)

    列出所有共享的文件夹权限或 NTFS 权限 PowerShell 此 PowerShell 脚本说明如何列出所有共享的文件夹权限或 NTFS 权限 下载 ListAllSharedFolderPermission zip 出所有共享的文件夹
  • HTML5网页设计常用标记-链接标记和列表标记

    链接标记 在HTML语言中 利用 a 标记在网页中创建超链接 语法格式 a href 跳转目标 target self 文本或图像 a 文字设置为超链接后 默认显示为加下划线的蓝色字体 图片设置为超链接后 会自动加一个黑色的边框 a 标记常
  • 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结

    程序占用的内存分为几个部分 各个部分起什么作用 字符数组 字符指针在实现上有什么区别等等 本文对此做了详细阐述 特转载于此 供大家学习参考之用 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 由编译器自动分配释放
  • 数据驱动性能体验优化

    本专题共10篇内容 包含淘宝APP基础链路过去一年在用户体验数据科学领域 包括商详 物流 性能 消息 客服 旅程等 一些探索和实践经验 在商详页基于用户动线和VOC挖掘用户决策因子带来浏览体验提升 在物流侧洞察用户求助时间与实际物流停滞时长
  • Ceph Pool操作总结

    Ceph Pool操作总结 一个ceph集群可以有多个pool 每个pool是逻辑上的隔离单位 不同的pool可以有完全不一样的数据处理方式 比如Replica Size 副本数 Placement Groups CRUSH Rules 快
  • bazel的使用

    bazel的使用 bazel是google开源的构建工具 可以支持多种语言的构建 这里来尝试一下如何在C 项目中使用bazel构建 安装就不介绍了 在官网很详细 输入bazel help Usage bazel
  • AD中如何对圆形PCB板进行铺铜

    因为之前做了一块圆形的PCB板子 所以在铺铜时候发现圆形铺铜我该怎么快速去铺 于是查了一下网上 大部分人是推荐先圈出一个圆弧 然后在通过快捷键TVG或者是按下 shift 空格 但是我发现不适合我 于是我分享一下自己的方法 我们如果要对圆形
  • 调参小技巧-DBSCAN参数选取方法

    利用循环迭代一些参数变量选取最适合的参数 1 初始数据处理部分 请自行对照调整 此处仅作为保持流程完整使用 读入第三方包 from sklearn import preprocessing 选取建模的变量 predictors Birth
  • 不得不引起足够重视的anonymous用户!

    连日的阴雨 使原本炎热的天气突然变得潮湿起来 烦躁的心情也慢慢地平复了下来 像往常一下 借用CuteFtp工具登录自己的VPS 检查一下文件异常 突然之间 几个刺眼的 exe文件呈现在我的眼前 顿时惊出我一身冷汗 下意识到 网站被黑客入侵了
  • C#使用Npgsql或SqlClient连接数据库

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