2012-05-24 83 views
2

我一直在建設這個項目作爲獨奏開發了一段時間,雖然我在前端和中間層舒服,我真的不認爲我做的是數據庫的方式,我是應該的,原因是因爲我根本不知道其他方式。目前我得到的數據的方式是,在我的MySQL Workbench和複製測試出查詢和粘貼SQL作爲一個字符串字面成說對DB呼叫的方法,拉動數據和滋潤我的對象。MySQL數據訪問層:你如何存儲你的查詢?

這不是真的是一個問題,直到最近,當我不得不創建一個查詢的怪物,它讓我想,也許有更好的方法來做到這一點。我沒有正式的DAL分離出來,所以我知道這裏有改進的餘地,但我很好奇存儲SQL字符串的正確方法。我認爲VS10內置了一個工具,我可以用SQL作爲SQL來操作和使用,而不是字符串。

+0

聽起來像是不錯的情況下MyBatis的:http://mybatis.org/dotnet.html – biziclop

+0

Visual Studio中有一個實體框架,可能是有用的,但它添加的ORM的複雜性大的層。 –

+1

我只是真的想找下降的文件,可能與.sql'的'的延伸,能夠引用它們的代碼莫名其妙的地方。那可能嗎?也許我甚至可以傳遞其屬性和方法可以被引用的對象? – Jason

回答

0

你應該在存儲過程中這樣做。這將基本上格式化和存儲您的查詢。您可以設置從代碼傳入的參數,然後讀出結果。

實施例:

C#的方法:

private void SetNote() 
{ 
    const string sql = "sp_SelectControllerNoteByID"; 
    using (var conn = MocSystem.GetMocDbConnection()) 
    { 
     using (var comm = new SqlCommand(sql, conn)) 
     { 
      comm.CommandType = CommandType.StoredProcedure; 
      comm.Parameters.Add(new SqlParameter("@ControllerNoteID", ControllerNoteId)); 
      try 
      { 
       conn.Open(); 
       using (var rdr = comm.ExecuteReader()) 
       { 
        while (rdr.Read()) 
        { 
         CommentText = rdr["NoteText"].ToString(); 
         _commentor = new User(new Guid(rdr["NoteAuthor"].ToString())); 
         CommentDate = (DateTime)rdr["NoteDate"]; 
         MocRequestId = (int)rdr["MocRequestID"]; 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       HasError = true; 
       ErrorMessage += "\nThere was a problem building the note: " + ex.Message; 
      } 
     } 
    } 
} 

(在此示例SQL Server)的數據庫管理系統上的存儲過程:

ALTER proc [dbo].[sp_SelectControllerNoteByID] 
    @ControllerNoteID int 
AS 
    SELECT 
     ControllerNoteID, 
     NoteText, 
     NoteDate, 
     NoteAuthor, 
     MocRequestID 
    FROM 
     ControllerNotes 
    WHERE 
     ControllerNoteID = @ControllerNoteID 

所以在這裏我們所說的存儲的過程,其在這種情況下只是一個簡單的select語句,然後我們通過ADO將它讀出到一個對象中。現在,通過這種方式,您可以修改查詢而無需重新編譯。除非您添加參數,否則您將不得不更新代碼中的參數。