2011-10-13 63 views
4

即時通訊,新的ASP MVC和我不知道如何創建基於存儲過程從我的數據庫模型。我已經有數據庫可以與另一個應用程序一起工作,並且我的網頁必須使用提到的db。ASP .NET MVC 3模型+存儲過程

如果有人能告訴我一些代碼描述正確的方法如何做到這一點, (如果我不是清楚:我需要創建使用存儲過程從我的數據庫,僅此而已ASP .NET模式)提前

TXH

回答

5

@fgeorgiew你只需要知道如何從存儲過程中填充模型(類)?你可以使用像NHibernate或Entity Framework這樣的ORM來爲你處理管道,或者使用原始的ADO.NET代碼,就像下面的例子。請注意,這只是粗略的代碼,但您明白了。

public class MyModel 
{ 
    public int ModelId { get; set; } 
    public string FirstName { get; set; } 
} 

public class SqlMyModelRespoitory : IMyModelRepository // optional for DI/IoC, assume interface with GetSingleModel method 
{ 
    public MyModel GetSingleModel() 
    { 
     MyModel model; 
     string connString = "server=10.1.1.1;database=MyDb;uid=me;pwd=hidden"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 
      using (SqlCommand cmd = new SqlCommand()) 
      { 
       cmd.Connection = conn; 
       cmd.CommandType = System.Data.CommandType.StoredProcedure; 
       cmd.CommandText = "p_GetMyModelFromDb"; 

       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         model = new MyModel 
         { 
          ModelId = Convert.ToInt32(reader[0]), 
          FirstName = reader[1].ToString() 
         }; 
        } 
       } 
      } 
     } 
     return model; 
    } 
} 
+0

這正是我需要的,謝謝! :) Btw達林Dimitrov answear它很好,但我不熟悉DI(認爲它是依賴注入)。 – fgeorgiew

+0

如果我想要獲取所有對象,該怎麼辦? –

3

你可以先從一些抽象的,表明你的意圖:

public interface IMyRepository 
{ 
    SomeModel Get(int id); 
} 

,那麼你可以寫一個將使用您的存儲過程的實現:

public class MyRepositorySql: IMyRepository 
{ 
    public SomeModel Get(int id) 
    { 
     ... call your stored procedure 
    } 
} 

然後設計自己的控制器,它需要這種抽象作爲參數:

public class MyController: Controller 
{ 
    private readonly IMyRepository _repository; 
    public MyController(IMyRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index(int id) 
    { 
     var model = _repository.Get(id); 
     return View(model); 
    } 
} 

現在,所有剩下的就是配置您的DI框架,通過正確實施到控制器的構造函數。正如您現在所看到的,控制器與數據獲取的方式完全分離。在你的數據訪問層中使用StoredProcs,一些ORM或其他任何東西並不重要。

+0

存儲過程你離開我身後1秒。 –

+0

thx :)我想我明白了。現在是時候實現這一點,看看結果 – fgeorgiew

0

好吧,讓我們說你有一個SP名爲Customers這是選擇像一些列:

ID
名稱
地址

現在,您將創建內部模型類的模型文件夾名爲「Customer.cs」並定義屬性如下:

public int ID { get; set; } 
public string Name { get; set; } 
public string Address { get; set; } 

這是你的MODEL類。

+0

thx 4的回覆,但我認爲你沒有正確理解我:)我知道什麼模型是從RoR或Php等,而問題不是關於映射C#模型類到Db表,但問題是關於如何使用我的數據庫和ADO .NET中的存儲過程來完成的。 (關於最後一個我不太確定):) – fgeorgiew

+0

明白了。我誤解了你的問題...... –

1

如何調用Asp.Net MVC

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Data; 
using System.Data.Entity; 
using System.Net; 
using System.Data.SqlClient; 

public partial class StudentRecord 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Marks { get; set; } 
    public string Grade { get; set; } 
    public Nullable<System.DateTime> DOB { get; set; } 
} 

public class SqlMyModelRespoitory : First_Test_DBEntities 
{ 
    public StudentRecord GetSingleModel() 
    { 
     StudentRecord model; 
     string connString = @"Paste Your Local Connection String"; 

     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 

      using (SqlCommand cmd = new SqlCommand()) 
      { 
       cmd.Connection = conn; 
       cmd.CommandType = System.Data.CommandType.StoredProcedure; 
       cmd.CommandText = "InsertStudent"; 

       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         model = new StudentRecord 
         { 
          Id = Convert.ToInt32(reader[0]), 
          Name = reader[1].ToString(), 
          Marks = reader[1].ToString(), 
          Grade = reader[1].ToString(), 
          DOB = Convert.ToDateTime(reader[1]) 
         }; 
        } 
       } 
      } 
     } 
     return model; 
    } 
}