SqlConnection
和SqlCommand
从数据库查询数据,并使用SqlDataReader
或DataTable
来读取返回的列表。在C#中,从数据库返回List是一个常见的操作,以下是详细的步骤和示例代码:
一、准备工作
1、引入命名空间
using System.Data;
:提供对数据的通用处理功能。
using System.Data.SqlClient;
:如果是连接SQL Server数据库,需要此命名空间来使用相关的数据库连接和操作类,如果连接其他类型数据库,如MySQL,则需引入对应的MySQL客户端命名空间,如using MySql.Data.MySqlClient;
。
2、创建数据库连接字符串
对于SQL Server数据库,连接字符串的格式通常如下:
string connectionString = "Server=服务器地址;Database=数据库名称;User Id=用户名;Password=密码;";
string connectionString = "Server=localhost;Database=TestDB;User Id=sa;Password=123456;";
二、查询数据并返回List
1、创建数据表类
根据数据库表中的字段,创建一个对应的C#类,假设数据库中有一个名为Users
的表,包含Id
、Name
和Age
三个字段,可以创建一个User
类来表示这个表的数据结构:
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
2、编写查询方法
使用SqlConnection
对象连接到数据库,使用SqlCommand
对象执行查询语句,并将结果读取到List<T>
中,以下是一个示例方法,用于从Users
表中查询所有用户并返回一个List<User>
:
public List<User> GetAllUsers() { List<User> users = new List<User>(); using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string sql = "SELECT Id, Name, Age FROM Users"; SqlCommand command = new SqlCommand(sql, connection); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { User user = new User(); user.Id = reader.GetInt32(reader.GetOrdinal("Id")); user.Name = reader.GetString(reader.GetOrdinal("Name")); user.Age = reader.GetInt32(reader.GetOrdinal("Age")); users.Add(user); } } } return users; }
三、示例说明
1、建立连接
使用SqlConnection
对象的构造函数传入连接字符串,创建与数据库的连接,在using
语句块中打开连接,这样可以确保在使用完毕后自动关闭连接,释放资源。
2、执行查询
创建一个SqlCommand
对象,将查询语句赋值给它的CommandText
属性,并将连接对象赋值给它的Connection
属性,然后调用ExecuteReader
方法执行查询,返回一个SqlDataReader
对象,用于读取查询结果。
3、读取数据
通过SqlDataReader
对象的Read
方法遍历查询结果的每一行,在循环内部,创建一个新的User
对象,并使用GetInt32
、GetString
等方法根据列名或列索引获取数据,然后将值赋给User
对象的属性,最后将User
对象添加到users
列表中。
四、完整示例代码
以下是一个完整的示例程序,展示了如何在C#中使用上述方法从数据库中查询数据并返回一个List<User>
:
using System; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; namespace DatabaseExample { class Program { static void Main(string[] args) { var users = GetAllUsers(); foreach (var user in users) { Console.WriteLine($"Id: {user.Id}, Name: {user.Name}, Age: {user.Age}"); } } public static List<User> GetAllUsers() { List<User> users = new List<User>(); string connectionString = "Server=localhost;Database=TestDB;User Id=sa;Password=123456;"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string sql = "SELECT Id, Name, Age FROM Users"; SqlCommand command = new SqlCommand(sql, connection); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { User user = new User(); user.Id = reader.GetInt32(reader.GetOrdinal("Id")); user.Name = reader.GetString(reader.GetOrdinal("Name")); user.Age = reader.GetInt32(reader.GetOrdinal("Age")); users.Add(user); } } } return users; } } public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } }
五、相关问答FAQs
1、问:如果数据库中的表结构发生变化,比如新增或删除了字段,应该如何修改代码?
答:如果数据库中的表结构发生变化,需要相应地修改C#中表示该表数据结构的类,如果表中新增了一个Email
字段,需要在User
类中添加一个Email
属性,并在查询方法和读取数据时添加对该字段的处理,如果删除了某个字段,也需要从相应的类和代码中移除对该字段的引用。
2、问:如何处理查询过程中可能出现的异常,比如数据库连接失败或查询语句错误?
答:可以使用try-catch
语句来捕获和处理异常,在建立数据库连接和执行查询的过程中,将代码放在try
块中,如果出现异常,会在catch
块中被捕获,可以根据具体的异常类型进行相应的处理,比如记录日志、提示用户等。
try { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); string sql = "SELECT Id, Name, Age FROM Users"; SqlCommand command = new SqlCommand(sql, connection); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { User user = new User(); user.Id = reader.GetInt32(reader.GetOrdinal("Id")); user.Name = reader.GetString(reader.GetOrdinal("Name")); user.Age = reader.GetInt32(reader.GetOrdinal("Age")); users.Add(user); } } } } catch (SqlException ex) { Console.WriteLine($"SQL Exception: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"Exception: {ex.Message}"); }
六、小编有话说
在C#中从数据库返回List是一种非常实用的技术,它可以方便地将数据库中的数据读取到内存中进行处理和操作,通过合理地设计数据表类、正确编写查询方法和妥善处理异常,可以高效地实现这一功能,为应用程序的数据交互提供有力支持。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1592465.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。