目录
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 类库中用于连接和操作关系型数据库的两个重要对象,它们有以下区别:
- 连接对象:SqlConnection 是一个连接数据库的对象,它用于建立与数据库的连接,并可以在连接状态下执行 SQL 语句。SqlCommand 是用于执行 SQL 语句的对象,它需要包含 SQL 语句和连接对象的信息,可以在连接状态下执行 SQL 语句,也可以单独使用。
- SQL 语句:SqlCommand 对象可以执行 SQL 语句,它可以包含任意的 SQL 语句,例如 SELECT、INSERT、UPDATE 或 DELETE 等操作。而 SqlConnection 对象只能用于执行 SQL 语句,它不能执行其他操作。
- 连接状态:SqlCommand 对象需要包含连接对象的信息,才能在连接状态下执行 SQL 语句。而 SqlConnection 对象可以在连接状态下执行 SQL 语句,也可以单独使用。
- 执行方式: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 对象将结果集绑定到数据控件上