【发布时间】:2012-03-18 15:48:05
【问题描述】:
我已经编码了一段时间,但仍然认为自己是初学者。我使用带有内置 SQL 语句的非常简单的 ADO.NET 类。我想听听社区关于我做错了什么以及如何改进,以及建议的下一步是将我的编码纳入当前标准的步骤。
我真的对尝试 EF 很感兴趣,尽管我似乎找不到适合我的 BLL 和 DAL 课程的教程,所以希望能指出正确的方向。
基本上,如果我有一个 Gift,我会创建一个 Gift 类 (BLL\Gift.cs):
using MyProject.DataAccessLayer;
namespace MyProject.BusinessLogicLayer
{
public class Gift
{
public int GiftID { get; set; }
public string GiftName { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public static Gift GetGiftByID(int GiftID)
{
GiftDAL dataAccessLayer = new GiftDAL();
return dataAccessLayer.GiftsSelectByID(GiftID);
}
public void DeleteGift(Gift myGift)
{
GiftDAL dataAccessLayer = new GiftDAL();
dataAccessLayer.DeleteGift(myGift);
}
public bool UpdateGift(Gift myGift)
{
GiftDAL dataAccessLayer = new GiftDAL();
return dataAccessLayer.UpdateGift(myGift);
}
public int InsertGift(string GiftName, string Description, decimal Price)
{
Gift myGift = new Gift();
myGift.GiftName = GiftName;
myGift.Description = Description;
myGift.Price = Price;
GiftDAL dataAccessLayer = new GiftDAL();
return dataAccessLayer.InsertGift(myGift);
}
}
}
然后我有一个 DAL 类来保存我的连接字符串 (DAL\sqlDAL.css):
namespace MyProject.DataAccessLayer
{
public class SqlDataAccessLayer
{
public readonly string _connectionString = string.Empty;
public SqlDataAccessLayer()
{
_connectionString = WebConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString;
if (string.IsNullOrEmpty(_connectionString))
{
throw new Exception("No database connection String found");
}
}
}
}
然后是一个 DAL 类 (DAL\giftDAL.cs),其中我展示了几个方法(更新和删除):
using MyProject.BusinessLogicLayer;
namespace MyProject.DataAccessLayer
{
public class GiftDAL : SqlDataAccessLayer
{
public bool UpdateGift(Gift GifttoUpdate)
{
string UpdateString = "";
UpdateString += "UPDATE Gifts SET";
UpdateString += "GiftName = @GiftName";
UpdateString += ",Description = @Description ";
UpdateString += ",Price = @Price ";
UpdateString += " WHERE GiftID = @GiftID";
int RowsAffected = 0;
try
{
using (SqlConnection con = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand(UpdateString, con))
{
cmd.Parameters.AddWithValue("@GiftName", GifttoUpdate.GiftName);
cmd.Parameters.AddWithValue("@Description", GifttoUpdate.Description);
cmd.Parameters.AddWithValue("@Price ", GifttoUpdate.Price);
cmd.Parameters.AddWithValue("@GiftID", GifttoUpdate.GiftID);
con.Open();
RowsAffected = cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
Utils.LogError(ex.Message, ex.InnerException == null ? "N/A" : ex.InnerException.Message, ex.StackTrace);
}
return (RowsAffected == 1);
}
public void DeleteGift(Gift GifttoDelete)
{
string DeleteString = "";
DeleteString += "DELETE FROM GIFTS WHERE GIFTID = @GiftID";
try
{
using (SqlConnection con = new SqlConnection(_connectionString))
{
using (SqlCommand cmd = new SqlCommand(DeleteString, con))
{
cmd.Parameters.AddWithValue("@GiftID", GifttoDelete.GiftID);
con.Open();
cmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
Utils.LogError(ex.Message, ex.InnerException == null ? "N/A" : ex.InnerException.Message, ex.StackTrace);
}
}
}
}
那么看看这个,你会建议我如何改进代码(如果我继续使用 ADO.NET)以及我的下一步是学习 EF - 还是有更好的选择?
干杯, 罗比
【问题讨论】:
-
我相信你应该把你的业务逻辑移动到SQL Server存储过程中。想想这个,只要你的一个表发生变化,你就必须改变代码,这意味着你应该调整您的代码再次编译+发布。创建一个库来调用这些存储过程。
-
@Myra:并非所有业务逻辑都可以在存储过程中表达。此外,数据层在概念上 (IMO) 是业务逻辑的错误位置。它更难测试,而且不便携。例如。您不能切换到内存数据库中的轻量级 SQLite 进行测试。在域模型和持久存储之间使用对象关系映射器可以最大限度地减少匹配两个世界中任何一个世界中的更改所需的工作量。所以我的建议是:将业务逻辑保留在代码中,并将数据库用作数据存储。 SP 应该只涉及数据问题,而不是业务逻辑。
标签: asp.net