开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# ADO.NET

C#ADO.NET教程展示了如何使用ADO.NET技术在C#中进行数据库编程。

ADO.NET

ADO.NET是一组用于数据库访问的类。它是一种统一对关系数据库、XML文件和其他应用程序数据的访问的规范。ADO.NET类位于System.Data命名空间中。

每个数据库都必须提供ADO.NET规范的实现:MySQL有MySQL.Data,PostgreSQL有Npgsql,SQLite有System.Data.SQLiteMicrosoft.Data.Sqlite

$ dotnet add package System.Data.SQLite

要使用SQLite数据库,我们需要添加System.Data.SQLitenuget包。

DataSet对象用于离线处理大量数据。它是一种断开连接的数据表示,可以保存来自各种不同来源的数据。

ADO.NETSQLite示例

在第一个示例中,我们使用SQLite数据库。

using System.Data.SQLite;

string cs = "Data Source=:memory:";
string stm = "SELECT SQLITE_VERSION()";

using var con = new SQLiteConnection(cs);
con.Open();

using var cmd = new SQLiteCommand(stm, con);
string? version = cmd.ExecuteScalar().ToString();

Console.WriteLine($"SQLite version: {version}");

该示例打印SQLite的版本。

string cs = "Data Source=:memory:";

我们使用内存数据库。

string stm = "SELECT SQLITE_VERSION()";

这条SQL语句决定了SQLite的版本。

using var con = new SQLiteConnection(cs);
con.Open();

SQLiteConnection创建到特定数据源的连接。参数是SQL语句和连接对象。

using var cmd = new SQLiteCommand(stm, con);

SQLiteCommand对象对数据源执行SQL语句。using声明将con变量放置在封闭范围的末尾。

string? version = cmd.ExecuteScalar().ToString();

ExecuteScalar返回结果集第一行的第一列(如果存在),如果没有返回结果集则返回null。

$ dotnet run 
SQLite version: 3.38.5.1

ADO.NETMySQL示例

在第二个示例中,我们使用MySQL。

using MySql.Data.MySqlClient;

string cs = @"server=localhost;userid=user12;password=s$cret;database=testdb";

using var con = new MySqlConnection(cs);
con.Open();

var stm = "SELECT VERSION()";
var cmd = new MySqlCommand(stm, con);

var version = cmd.ExecuteScalar().ToString();
Console.WriteLine($"MySQL version: {version}");

有几个变化。

using MySql.Data.MySqlClient;

我们使用MySQL命名空间。

string cs = @"server=localhost;userid=user12;password=s$cret;database=testdb";

连接字符串适用于MySQL。

using var con = new MySqlConnection(cs);

我们使用MySqlConnection而不是SQLiteConnection

var stm = "SELECT VERSION()";

SQL语句是MySQL特有的。

var cmd = new MySqlCommand(stm, con);

该命令称为MySqlCommand

$ dotnet run
MySQL version: 8.0.29-0ubuntu0.22.04.2

ADO.NET创建表

在下面的例子中,我们创建了一个数据库表并用数据填充它。

using System.Data.SQLite;

string cs = @"URI=file:test.db";    

using var con = new SQLiteConnection(cs);
con.Open();

using var cmd = new SQLiteCommand(con);

cmd.CommandText = "DROP TABLE IF EXISTS cars";
cmd.ExecuteNonQuery();

cmd.CommandText = @"CREATE TABLE cars(id INTEGER PRIMARY KEY,
            name TEXT, 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();

如果表已经存在,我们首先删除它。如果我们不想要结果集,例如DROPINSERTDELETE,我们使用ExecuteNonQuery方法声明。

cmd.CommandText = @"CREATE TABLE cars(id INTEGER PRIMARY KEY,
            name TEXT, price INT)";
cmd.ExecuteNonQuery();

cars表已创建。INTEGERPRIMARYKEY列在SQLite中自动递增。

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

我们运行程序。

$ sqlite3 test.db

我们用sqlite3工具打开test.db数据库。

sqlite> SELECT * FROM cars;
1|Audi|52642
2|Mercedes|57127
3|Skoda|9000
4|Volvo|29000
5|Bentley|350000
6|Citroen|21000
7|Hummer|41400
8|Volkswagen|21600

我们验证数据。

ADO.NET读取数据

在SQLite驱动程序中,我们使用SQLiteDataReader从数据库中获取数据。它与SQLiteCommand类一起使用来执行SELECT语句,然后访问返回的行。

using System.Data.SQLite;

string cs = @"URI=file:test.db";

using var con = new SQLiteConnection(cs);
con.Open();

string stm = "SELECT * FROM cars LIMIT 5";

using var cmd = new SQLiteCommand(stm, con);
using SQLiteDataReader rdr = cmd.ExecuteReader();

while (rdr.Read())
{
    Console.WriteLine($"{rdr.GetInt32(0)} {rdr.GetString(1)} {rdr.GetInt32(2)}");
}

我们从cars表中获取五行并将它们打印到终端。

using SQLiteDataReader rdr = cmd.ExecuteReader();

要创建一个SQLiteDataReader对象,我们调用SQLiteCommand对象的ExecuteReader方法。

while (rdr.Read())
{
    Console.WriteLine($"{rdr.GetInt32(0)} {rdr.GetString(1)} {rdr.GetInt32(2)}");
}

Read方法将数据读取器推进到下一条记录。如果有更多行,则返回true;否则为假。我们可以使用数组索引符号检索值,或使用特定方法以其本机数据类型访问列值。后者效率更高。

$ dotnet run
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000

ADO.NETLINQ示例

我们可以在ADO.NET中使用LINQ。SQLiteDataAdapter是System.Data.DataSet和数据源之间的桥梁。

using System.Data.SQLite;
using System.Data;
string cs = @"URI=file:test.db";

using var ds = new DataSet();
using var con = new SQLiteConnection(cs);
using var sad = new SQLiteDataAdapter("SELECT * FROM cars", con);

sad.Fill(ds);

var res = from dt in ds?.Tables[0]?.AsEnumerable()
          select new
          {
              Id = dt.Field<long>("id"),
              Name = dt.Field<string>("name"),
              Price = dt.Field<int>("price"),
          };

foreach (var e in res)
{
    Console.WriteLine(e);
}

Console.WriteLine(res.Count());

SQLiteDataAdapter用于填充DataSet,我们从中创建一个可枚举的。在该可枚举对象上执行LINQ查询。

$ dotnet run
{ Id = 1, Name = Audi, Price = 52642 }
{ Id = 2, Name = Mercedes, Price = 57127 }
{ Id = 3, Name = Skoda, Price = 9000 }
{ Id = 4, Name = Volvo, Price = 29000 }
{ Id = 5, Name = Bentley, Price = 350000 }
{ Id = 6, Name = Citroen, Price = 21000 }
{ Id = 7, Name = Hummer, Price = 41400 }
{ Id = 8, Name = Volkswagen, Price = 21600 }
8

在本文中,我们使用了ADO.NET。

列出所有C#教程。

未经允许不得转载:我爱分享网 » C# ADO.NET

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏