将数据访问代码分离到不同的层中
本文关键字:数据 访问 代码 分离 | 更新日期: 2023-09-27 18:26:29
我试图将此功能分离为传统的三层模式,但遇到了一些困难。
数据访问不是我经常处理的事情,我希望得到一些指导。
我从这个博客的代码开始,到目前为止我所做的工作如下。我正在将返回类型转换为SqlDataReader
,现在我已经注释掉了需要分离的代码。
// This is the DAL layer:
public SqlDataReader DownloadFile(int fileId)
{
//int id = int.Parse((sender as LinkButton).CommandArgument);
//byte[] bytes;
//string fileName, contentType;
//string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
//using (SqlConnection con = new SqlConnection(constr))
//{
cmd.CommandText = "SELECT [fileId],[fileName],[fileData],[postedBy] FROM [dbo].[FilesLibrary] where fileId=@Id";
cmd.Parameters.AddWithValue("@Id", fileId);
cmd.Connection = cmd.Connection;
try
{
cmd.Connection.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
//sdr.Read();
//bytes = (byte[])sdr["Data"];
//contentType = sdr["ContentType"].ToString();
//fileName = sdr["Name"].ToString();
return sdr;
}
}
catch (Exception ex)
{
cmd.Connection.Close();
throw;
}
//}
//Response.Clear();
//Response.Buffer = true;
//Response.Charset = "";
//Response.Cache.SetCacheability(HttpCacheability.NoCache);
//Response.ContentType = contentType;
//Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
//Response.BinaryWrite(bytes);
//Response.Flush();
//Response.End();
}
// The BL is below:
public SqlDataReader GetFileDownload(int fileId)
{
try
{
dsGetFiles files = new dsGetFiles();
return files.DownloadFile(fileId);
}
catch (Exception ex) { throw ex; }
}
// The code file is as follows:
protected void DownloadFile(object sender, EventArgs e)
{
int id = int.Parse((sender as LinkButton).CommandArgument);
byte[] bytes;
string fileName, contentType;
GetFiles fileInfo = new GetFiles();
fileInfo.GetFileDownload(id);
// Here I don't know what to do with the fileInfo object and how to get data out of it.
//sdr.Read();
//bytes = (byte[])sdr["fileData"];
//contentType = sdr["ContentType"].ToString();
//fileName = sdr["fileName"].ToString();
Response.Clear();
Response.Buffer = true;
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = contentType;
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}
// This is the DAL layer:
public DataSet DownloadFile(int fileId)
{
//I don't know from where you are taking your command and connection, but I will assume that this is working correctly, I don't like this method ! Also close a connection only on catch block? Your are using only one connection ? If you tell me that this method is not working I will re write it too.
cmd.CommandText = "SELECT [fileId],[fileName],[fileData],[postedBy] FROM [dbo].[FilesLibrary] where fileId=@Id";
cmd.Parameters.AddWithValue("@Id", fileId);
cmd.Connection = cmd.Connection;
try
{
cmd.Connection.Open();
DataSet dst = new DataSet();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(dst, "FilesLibary");
}
return dst;
}
catch (Exception ex)
{
cmd.Connection.Close();
throw;
}
}
// The BL is below:
public byte[] GetFileDownload(int fileId)
{
try
{
DataSet fileDst = new DownloadFile();// method from DA layer
return (byte[])fileDst.Tables[0].Rows[0]["fileData"];
}
catch (Exception ex) { throw ex; }
}
protected void DownloadFile(object sender, EventArgs e)
{
int id = int.Parse((sender as LinkButton).CommandArgument);
byte[] bytes = fileInfo.GetFileDownload(id);
//Now do your magic, if you want to have fileName in the business logic you should take GetFileDownload should return DataSet. After that take byte[] and fileName. I will write the fileName to be test for this case to not re write everything here !
Response.Clear();
Response.Buffer = true;
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = contentType;
Response.AppendHeader("Content-Disposition", "attachment; filename=Test");
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}
请注意:您的DataAccess层非常糟糕。你应该重写它。就像我在DataLayer中更改你的方法后看到的那样,你甚至不需要BO逻辑方法,因为你的数据层会重新调用所需的DataSet,并且你可以在protected void DownloadFile(object sender, EventArgs e)
中调用
在这个问题中,我写了一个完整的小数据层类,如果你愿意,你可以检查一下:检查用户名或用户电子邮件已存在
PS。很抱歉出现开方括号和尾括号的格式问题!