网上购物系统(Task004)——通用数据库访问函数

本文介绍了C#中三种常见的数据库操作方法:try...catch...finally结构、using()结构及通用数据库访问函数,并展示了如何利用Repeater控件显示数据。

源代码:13033480群共享

一、try…catch…finally结构

using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Collections.Generic; using WestGarden.Model; namespace WestGarden.Web { public partial class Default1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { IList<CategoryInfo> catogories = new List<CategoryInfo>(); string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString; string cmdText = "SELECT * FROM Category"; SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); try { cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = cmdText; conn.Open(); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2)); catogories.Add(category); } rdr.Close(); } finally { conn.Close(); } ddlCategories.DataSource = catogories; ddlCategories.DataTextField = "Name"; ddlCategories.DataValueField = "CategoryId"; ddlCategories.DataBind(); } } }


二、using()结构

using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Collections.Generic; using WestGarden.Model; namespace WestGarden.Web { public partial class Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { IList<CategoryInfo> catogories = new List<CategoryInfo>(); string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString; string cmdText = "SELECT * FROM Category"; SqlCommand cmd = new SqlCommand(); //简单地说,using()结构等同于前面的try...finally结构,隐式关闭了conn。 using(SqlConnection conn = new SqlConnection(connectionString)) { cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = cmdText; conn.Open(); SqlDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2)); catogories.Add(category); } rdr.Close(); } ddlCategories.DataSource = catogories; ddlCategories.DataTextField = "Name"; ddlCategories.DataValueField = "CategoryId"; ddlCategories.DataBind(); } } }


三、通用的数据库访问函数

using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Collections.Generic; using WestGarden.Model; namespace WestGarden.Web { public partial class Default3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { IList<CategoryInfo> catogories = new List<CategoryInfo>(); string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString; string cmdText = "SELECT * FROM Category"; SqlDataReader rdr = ExecuteReader(connectionString, CommandType.Text, cmdText); while (rdr.Read()) { CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2)); catogories.Add(category); } rdr.Close(); ddlCategories.DataSource = catogories; ddlCategories.DataTextField = "Name"; ddlCategories.DataValueField = "CategoryId"; ddlCategories.DataBind(); } public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); try { cmd.Connection = conn; cmd.CommandType = cmdType; cmd.CommandText = cmdText; conn.Open(); //如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection, //则关闭 SqlDataReader 会自动关闭此连接 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); return rdr; } catch { conn.Close(); throw; } //finally //{ // conn.Close(); //} } } }


四、完善一下通用数据库访问函数

using System; using System.Data; using System.Data.SqlClient; using System.Configuration; using System.Collections.Generic; using WestGarden.Model; namespace WestGarden.Web { public partial class Default4 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { IList<CategoryInfo> catogories = new List<CategoryInfo>(); string connectionString = ConfigurationManager.ConnectionStrings["NetShopConnString"].ConnectionString; string cmdText = "SELECT * FROM Category"; SqlDataReader rdr = ExecuteReader(connectionString, CommandType.Text, cmdText,null); while (rdr.Read()) { CategoryInfo category = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2)); catogories.Add(category); } rdr.Close(); ddlCategories.DataSource = catogories; ddlCategories.DataTextField = "Name"; ddlCategories.DataValueField = "CategoryId"; ddlCategories.DataBind(); } public static SqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) { SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(connectionString); try { //cmd.Connection = conn; //cmd.CommandType = cmdType; //cmd.CommandText = cmdText; //conn.Open(); PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); //如果创建了 SqlDataReader 并将 CommandBehavior 设置为 CloseConnection, //则关闭 SqlDataReader 会自动关闭此连接。 SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear(); return rdr; } catch { conn.Close(); throw; } //finally //{ // conn.Close(); //} } private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null) cmd.Transaction = trans; cmd.CommandType = cmdType; if (cmdParms != null) { foreach (SqlParameter parm in cmdParms) cmd.Parameters.Add(parm); } } } }


五、使用Reapter显示分类名称

1、窗体代码:

<asp:Repeater ID="repCategories" runat="server"> <HeaderTemplate> <table cellspacing="0" border="0" style="border-collapse: collapse;"> </HeaderTemplate> <ItemTemplate> <tr> <td> <asp:HyperLink runat="server" ID="lnkCategory" NavigateUrl='<%# string.Format("~/Items.aspx?page=0&categoryId={0}", Eval("CategoryId")) %>' Text='<%# Eval("Name") %>' /><asp:HiddenField runat="server" ID="hidCategoryId" Value='<%# Eval("CategoryId") %>' /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater>

2、代码页绑定代码:

repCategories.DataSource = catogories; repCategories.DataBind();


版权所有©2012,西园电脑工作室.欢迎转载,转载请注明出处.更多文章请参阅博客http://blog.csdn.com/yousuosi

在 ASP.NET Core 3.1 中使用 Entity Framework Core 封装通用的 CRUD 操作,可以采用泛型仓储模式(Generic Repository Pattern),以提高代码的复用性和维护性。以下是一种实现方式: ### 1. 定义通用仓储接口 首先定义一个通用接口 `IRepository<T>`,其中包含常见的 CRUD 操作方法。 ```csharp public interface IRepository<T> where T : class { Task<IEnumerable<T>> GetAllAsync(); Task<T> GetByIdAsync(int id); Task AddAsync(T entity); Task UpdateAsync(T entity); Task DeleteAsync(T entity); } ``` ### 2. 实现通用仓储类 接下来创建一个实现该接口的通用仓储类 `Repository<T>`,它依赖于 `DbContext` 并通过构造函数注入。 ```csharp public class Repository<T> : IRepository<T> where T : class { private readonly DbContext _context; private readonly DbSet<T> _dbSet; public Repository(DbContext context) { _context = context; _dbSet = _context.Set<T>(); } public async Task<IEnumerable<T>> GetAllAsync() { return await _dbSet.ToListAsync(); } public async Task<T> GetByIdAsync(int id) { return await _dbSet.FindAsync(id); } public async Task AddAsync(T entity) { await _dbSet.AddAsync(entity); await _context.SaveChangesAsync(); } public async Task UpdateAsync(T entity) { _dbSet.Attach(entity); _context.Entry(entity).State = EntityState.Modified; await _context.SaveChangesAsync(); } public async Task DeleteAsync(T entity) { _dbSet.Remove(entity); await _context.SaveChangesAsync(); } } ``` ### 3. 注册依赖注入 在 `Startup.cs` 文件的 `ConfigureServices` 方法中注册通用仓储,以便在应用中使用依赖注入。 ```csharp services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); ``` ### 4. 在服务或控制器中使用通用仓储 通过构造函数注入 `IRepository<T>`,然后在业务逻辑中调用其方法。 ```csharp [ApiController] [Route("[controller]")] public class ProductsController : ControllerBase { private readonly IRepository<Product> _productRepository; public ProductsController(IRepository<Product> productRepository) { _productRepository = productRepository; } [HttpGet] public async Task<IActionResult> GetAllProducts() { var products = await _productRepository.GetAllAsync(); return Ok(products); } [HttpGet("{id}")] public async Task<IActionResult> GetProduct(int id) { var product = await _productRepository.GetByIdAsync(id); if (product == null) { return NotFound(); } return Ok(product); } [HttpPost] public async Task<IActionResult> CreateProduct([FromBody] Product product) { await _productRepository.AddAsync(product); return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); } [HttpPut] public async Task<IActionResult> UpdateProduct([FromBody] Product product) { await _productRepository.UpdateAsync(product); return NoContent(); } [HttpDelete("{id}")] public async Task<IActionResult> DeleteProduct(int id) { var product = await _productRepository.GetByIdAsync(id); if (product == null) { return NotFound(); } await _productRepository.DeleteAsync(product); return NoContent(); } } ``` ### 5. 数据库上下文配置 确保你的 `DbContext` 类正确配置了实体集和连接字符串,例如: ```csharp public class MyDbContext : DbContext { public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { } public DbSet<Product> Products { get; set; } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值