将数据访问代码分离到不同的层中

本文关键字:数据 访问 代码 分离 | 更新日期: 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。很抱歉出现开方括号和尾括号的格式问题!