2014-10-15 3 views
1

Я пытаюсь разделить эту функциональность на традиционный трехуровневый шаблон, но с некоторыми трудностями.Разделение кода доступа к данным на отдельный уровень

Доступ к данным - это не то, с чем я работал много, и мне хотелось бы получить некоторые рекомендации.

Я начал с code from this blog, и то, что я сделал до сих пор, ниже. Я конвертирую возвращаемый тип в 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 [email protected]"; 
     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(); 
} 
+0

Скажите, если что-то непонятно! – mybirthname

ответ

1
// 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 [email protected]"; 
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 логики, потому что ваш слой данных будет Retrun необходимо DataSet, и вы можете назвать в protected void DownloadFile(object sender, EventArgs e)

В этом вопросе я написал немного полный слой данных класс, если вы хотите, вы можете его проверить.: checking user name or user email already exists

PS. Извините за возникновение проблемы с открытой и конечной скобками!

+0

Совершенно ясно. Использование типа 'Dataset' имеет смысл. Итак, как бы вы переписывали DataLayer? Только для того, чтобы отметить, я обычно использую sproc, а не sql-инструкцию в DAL, возможно, это то, о чем вы говорите. – Risho

+0

@ Risho слой данных должен быть более абстрактным. Этот слой никогда не должен возвращать данные для определенного объекта, как в вашем случае. Как я уже сказал, вы можете проверить ответ, который я написал в другом вопросе stackoverflow. Я отправляю ссылку в ответ. – mybirthname

+0

@ Risho одним из способов сделать слой данных является предоставление только SqlCommand для слоя. Также, если ответ помог вам просто принять его :) – mybirthname

 Смежные вопросы

  • Нет связанных вопросов^_^