2017-01-01 30 views
0

を働いていないので、私が最も可能性が高い私はすでにこのことを知って、何か間違ったことがあります。私はちょうど正確に何が間違っているか把握することができません。私はこの2つの異なる方法を試しましたが、私はそれぞれの方法から異なる結果を得ています。 さて、ここで私は、ビューのデータを取得するストアドプロシージャを使用しようとしています、行きます。ASP.NET MVCとストアドプロシージャは、正しく

public class CharacterCraftNamesListViewModel 
    { 
     public string CharFullName { get; set; } 
     public string ProfName { get; set; } 
    } 

public class CharacterCraftCraftListViewModel 
    { 
     public string CraftClassName { get; set; } 
     public int CharCraftCharID { get; set; } 
     public int CharCraftClassID { get; set; } 
     public int CharCraftLevelID { get; set; } 
     public bool CraftLevelSet { get; set; } 
     public string CraftLevelName { get; set; } 
     public bool CraftLevelMastery { get; set; } 

    } 

は、私はまた、データベースに2つの対応するストアドプロシージャを持っている:私は、次のような二つのビューモデルを持っています。

CREATE PROCEDURE [dbo].[GetCharacterCraftCharacterNameProfessionName] 
       @CharID int = NULL 
    AS 
    WITH CHCRNames_CTE ([CCCID], [CharFull], [ProfName]) 
    AS 
     (SELECT 
      Character_Char_ID, 
      CASE 
        WHEN b.Char_Last_Name IS NULL THEN b.Char_First_Name 
        ELSE b.Char_First_Name + ' ' + b.Char_Last_Name 
      END AS FullName, 
      c.Profession_Name 
      FROM CharacterCraft a LEFT OUTER JOIN 
      [Character] b ON a.Character_Char_ID = b.Char_ID LEFT OUTER JOIN 
      [Profession] c ON c.Profession_ID = b.Profession_Profession_ID 
      ) 
    SELECT DISTINCT CharFull, ProfName 
    FROM CHCRNames_CTE 
    WHERE CCCID = @CharID 

と私のコントローラ内部

CREATE PROCEDURE [dbo].[GetCharacterCraftRank] 
       @CharID int = NULL, 
       @Rank int = NULL 
    AS 
    WITH CHCR_CTE ([Rank], [CCID], [CCCCID], [CCName], [CLCLID], [CLName], [CLTier], [CLS], [CLM]) 
    AS 
     (SELECT 
       DENSE_RANK() OVER(PARTITION BY(a.Character_Char_ID)ORDER BY (a.CraftClass_Craft_Class_ID)) AS [Rank], 
       a.Character_Char_ID, 
       CraftClass_Craft_Class_ID, 
       c.Craft_Class_Name, 
       CraftLevel_Craft_Level_ID, 
       d.Craft_Level_Name, 
       d.Craft_Level_Tier, 
       Craft_Level_Set, 
       Craft_Level_Mastery 
     FROM CharacterCraft a LEFT OUTER JOIN 
     [Character] b ON a.Character_Char_ID = b.Char_ID LEFT OUTER JOIN 
     [CraftClass] c ON a.CraftClass_Craft_Class_ID = c.Craft_Class_ID LEFT OUTER JOIN 
     [CraftLevel] d ON a.CraftLevel_Craft_Level_ID = d.Craft_Level_ID 
     ) 
    SELECT [CCID], [CCCCID], [CCName], [CLCLID], [CLS], [CLName], [CLM] 
    FROM CHCR_CTE 
    WHERE [CCID]= @CharID AND [Rank] = @Rank 
    ORDER BY [Rank], [CLTier] 

私は、次のしている:

public async Task<ActionResult> Edit(int? id) 
      { 
       if (id == null) 
       { 
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
       } 
    var names = await db.Database.SqlQuery<CharacterCraftNamesListViewModel>(sql: "GetCharacterCraftCharacterNameProfessionName", parameters: new object[] { id }).ToListAsync(); 
      var alist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank", parameters: new object[] { id, 1 }).ToListAsync(); 
      var blist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank", parameters: new object[] { id, 2 } ).ToListAsync(); 
      var clist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank", parameters: new object[] { id, 3 } ).ToListAsync(); 
      var characterCraft = new CharacterCraftViewModel() 
      { 
       CharNames = names.AsEnumerable(), 
       CraftListA = alist.AsEnumerable(), 
       CraftListB = blist.AsEnumerable(), 
       CraftListC = clist.AsEnumerable() 
      }; 
    if (characterCraft == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(characterCraft); 
    } 

私は以下を参照してくださいデバッガを見て:

  • ID 1
  • 名がカウント= 0
  • 連想リストカウント= 0
  • blistカウント= 0
  • CLISTカウント= 0
  • characterCraft
    {LotroMvc.Models.CharacterCraftViewModels.CharacterCraftViewModel}これにだから

私は空白のページを得ることに終わります。

は、今は、コントローラ自体にストアドプロシージャを配置しようとしている、およびデバッガに異なる出力になってしまっています。

public async Task<ActionResult> Edit(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
var query = "WITH CHCRNames_CTE([CCCID], [CharFull], [ProfName]) " 
        + "AS " 
        + "(SELECT " 
        + "Character_Char_ID, " 
        + "CASE " 
        + "WHEN b.Char_Last_Name IS NULL THEN b.Char_First_Name " 
        + "ELSE b.Char_First_Name + ' ' + b.Char_Last_Name " 
        + "END AS FullName, " 
        + "c.Profession_Name " 
        + "FROM CharacterCraft a LEFT OUTER JOIN " 
        + "dbo.[Character] b ON a.Character_Char_ID = b.Char_ID LEFT OUTER JOIN " 
        + "dbo.[Profession] c ON c.Profession_ID = b.Profession_Profession_ID " 
        + ") " 
        + "SELECT DISTINCT CharFull, ProfName " 
        + "FROM CHCRNames_CTE " 
        + "WHERE CCCID = @p0"; 
     var names = await db.Database.SqlQuery<CharacterCraftNamesListViewModel>(query, id).ToListAsync(); 
     var rank = "WITH CHCR_CTE([Rank], [CCID], [CCCCID], [CCName], [CLCLID], [CLName], [CLTier], [CLS], [CLM])" 
        + "AS " 
        + "(SELECT " 
        + "DENSE_RANK() OVER(PARTITION BY(a.Character_Char_ID)ORDER BY (a.CraftClass_Craft_Class_ID)) AS [Rank], " 
        + "a.Character_Char_ID, " 
        + "CraftClass_Craft_Class_ID, " 
        + "c.Craft_Class_Name, " 
        + "CraftLevel_Craft_Level_ID, " 
        + "d.Craft_Level_Name, " 
        + "d.Craft_Level_Tier, " 
        + "Craft_Level_Set, " 
        + "Craft_Level_Mastery " 
        + "FROM CharacterCraft a LEFT OUTER JOIN " 
        + "[Character] b ON a.Character_Char_ID = b.Char_ID LEFT OUTER JOIN " 
        + "[CraftClass] c ON a.CraftClass_Craft_Class_ID = c.Craft_Class_ID LEFT OUTER JOIN " 
        + "[CraftLevel] d ON a.CraftLevel_Craft_Level_ID = d.Craft_Level_ID " 
        + ") " 
        + "SELECT [CCID], [CCCCID], [CCName], [CLCLID], [CLS], [CLName], [CLM] " 
        + "FROM CHCR_CTE " 
        + "WHERE [CCID]= @p0 AND [Rank] = @p1 " 
        + "ORDER BY [Rank], [CLTier]"; 
     var alist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(rank, parameters: new object[] { id, 1 }).ToListAsync(); 
     var blist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(rank, parameters: new object[] { id, 2 } ).ToListAsync(); 
     var clist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(rank, parameters: new object[] { id, 3 } ).ToListAsync(); 
     var characterCraft = new CharacterCraftViewModel() 
     { 
      CharNames = names.AsEnumerable(), 
      CraftListA = alist.AsEnumerable(), 
      CraftListB = blist.AsEnumerable(), 
      CraftListC = clist.AsEnumerable() 
     }; 
if (characterCraft == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(characterCraft); 
} 

これは、デバッガで次の私が得られる:

  • 本{LotroMvc.Controllers.CharacterCraftsController}
  • ID 1
  • クエリ「私が試しコントローラ内部

    ( SELECT Character_Char_ID、CASE b.Char_Last_Name次いでNULLであるようCHCRNames_CTE([CCCID]、[CharFull]、[ProfName])WITH CharacterCraft FROMフルネーム、c.Profession_Name LEFT OUTER
    DBOをJOIN AS b.Char_First_Name ELSE b.Char_First_Name + '' + b.Char_Last_Name
    END。a.Character_Char_ID = b.Char_ID LEFT OUTER ON [文字] B DBOをc.Profession_ID =
    b.Profession_Profession_ID ON [職業] CをJOIN)CCCID = @ P0" 名が[0] {LotroMvc.Models.CharacterCraftViewModels = 1

  • カウント CHCRNames_CTE区別CharFull、ProfNameを選択します。CHCR_CTE WITH CharacterCraftNamesListViewModel}
  • CharFullNameヌル
  • ProfName "歴史"
  • ランク」([ランク]、 [CCID]、[CCCCID]、[CCName]、[CLCLID]、[CLName]、[CLTier] [CLS]、 [CLM]) AS OVER((a.CraftClass_Craft_Class_ID)BY PARTITION BY(a.Character_Char_ID)ORDER)(DENSE_RANK(SELECT)を[ランク]、a.Character_Char_ID、CraftClass_Craft_Class_ID、 c.Craft_Class_Name AS 、CraftLevel_Craft_Level_ID、d.Craft_Level_Name、 d.Craft_Level_Tier、Craft_Level_Set、Craft_Level_Masteryから キャラクタークラフト左アウトジョイン[キャラクター] b ON a.Character_Char_ID = b.Char_ID LEFT OUTER [CraftClass] a.CraftClass_Craft_Class_ID = c.Craft_Class_ID LEFT OUTER ON cはJOIN JOIN [CraftLevel] D ON a.CraftLevel_Craft_Level_ID = d.Craft_Level_ID) SELECT [CCID]、[CCCCID] 、[CLName]、 [CLID] CHCR_CTEのどこから[CCID] = @ p0かつ[Rank] = @ p1 ORDER BY [ランク]、[CLTier] "
  • [CLName]、[CLCLID]、[CLS]
  • 連想リストカウント= 9
  • [0] {LotroMvc.Models.CharacterCraftViewModels.CharacterCraftCraftListViewModel}
  • CharCraftCharID 0
  • CharCraftClassID 0
  • CharCraftLevelID 0
  • CraftClassNameヌル
  • CraftLevelMastery偽
  • CraftLevelNameヌル
  • CraftLevelSet連想リスト内のデータはカウントは間違いなく間違っているものの
  • (など)

偽それは正しいです。名前には正しいProfNameが表示されますが、CharFullNameには不正なデータが表示されます。だから私はここで何をすべきかと迷っている。私がT-SQLでストアドプロシージャを実行すると、正しいデータが表示されますが、それはサーバだけにあります。私はMVCとSQLを正しく再生することができず、私のコードだと分かっています。私はちょうどコードが間違っているのか分かりません。私が間違っていたところへの思いは?

答えて

0

私はこれを理解しました。問題の原因となった2つのことが間違っていました。次のコードでは、プログラムが正しくSQL Serverにそれを呼び出していませんでした。

var names = await db.Database.SqlQuery<CharacterCraftNamesListViewModel>(sql: "GetCharacterCraftCharacterNameProfessionName", parameters: new object[] { id }).ToListAsync(); 
     var alist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank", parameters: new object[] { id, 1 }).ToListAsync(); 
     var blist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank", parameters: new object[] { id, 2 } ).ToListAsync(); 
     var clist = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank", parameters: new object[] { id, 3 } ).ToListAsync(); 

のSQLQuery呼び出しは、私がプログラムによって出力されたものSSMSに置かれたとき、私が得た、私は読んだことがあるすべてのものを通して正しいですがヌル集合。そこで私はsql: "GetCharacterNameProfessionName"とsql: "GetCharacterCraftRank"をsql: "GetCharacterNameProfessionName @ p0"とsql: "GetCharacterCraftRank @ p0、@ p1"に変更しました。これは、コントローラでクエリを書き出したときと同様の出力です。

次の問題は命名規則になりました。何が起こるかを見るためにデータベースファーストモデルを実行したとき、私は実際にうんざりしていました。実際にはうまくいきました。しかし、私が行っていたときに、ストアドプロシージャの列の名前をコード内の列にマップすることができたことに気付きました。つまり、私のストアドプロシージャを単純に変更して、カラム名をプログラムに入れたものと一致させ、すべてが正しく機能するようになったのです。いくつかのマイナーな微調整と私の取得コントローラは次のようになります:

public async Task<ActionResult> Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var characterCraft = new CharacterCraftViewModel() 
     { 
      CharNames = await db.Database.SqlQuery<CharacterCraftNamesListViewModel>(sql: "GetCharacterCraftCharacterNameProfessionName @p0", parameters: new object[] { id }).FirstAsync(), 
      CraftListA = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank @p0, @p1", parameters: new object[] { id, 1 }).ToListAsync(), 
      CraftListB = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank @p0, @p1", parameters: new object[] { id, 2 }).ToListAsync(), 
      CraftListC = await db.Database.SqlQuery<CharacterCraftCraftListViewModel>(sql: "GetCharacterCraftRank @p0, @p1", parameters: new object[] { id, 3 }).ToListAsync() 
     }; 

     if (characterCraft == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(characterCraft); 
    } 

これは他の人に役立つことを願っています。

関連する問題