2017-02-06 127 views
0
using System; 
using System.Collections.Generic; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using Dapper; 
namespace Calculate.Models 
{ 
    public class SelectedDetailsGetter 
    { 
     SqlConnection con = new SqlConnection("Data Source=CHANDAKG-01-L\\SQLEXPRESS;initial catalog=Calculator;integrated security=true"); 
     public IEnumerable<SelectedDetails> GetSelectedDetails(string Name) 
     { 

      string query = "SELECT * FROM DataNorm WHERE [email protected] AND year(DateMonth)=2014"; 
       var result = con.Query<SelectedDetails>(query,new { name = Name }); 
       return result; 
     } 
    } 
} 

此查詢始終返回空值。有什麼不對??誰能告訴使用SingleOrDefault()此Dapper查詢總是返回null

+0

GetSelectedDetails是否返回null或者你是否說在它上調用'SingleOrDefault'返回null? – juharr

+0

GetSelectedDetails()返回null .. –

+0

您是否將實際的提供者名稱傳遞給「名稱」?如果您在SSMS中使用Provider ='whomever'運行該查詢,它會返回數據嗎?我假設,當你沒有傳入任何東西時,查詢沒有返回任何內容。調試查詢。看看它爲什麼產生「結果」。也許你連接不好? 「SelectedDetails」中的道具與SQL列名稱相同嗎? – Ethilium

回答

1

首先,SingleOrDefault()函數將始終返回一個唯一的寄存器,如果當然存在。當查詢結果不止一次返回行時,人們使用,但在這種情況下,只有第一個問題。

現在,解決你的問題的

始終使用「利用」與連接的工作,它的最好的辦法,以保證你將永遠不會忘記關閉和處置打開的連接。

您總是需要在實例化對象Connection後打開連接。

試試這個:

public IEnumerable<SelectedDetails> GetSelectedDetails(string Name) 
      { 
       using (var con = new SqlConnection("Data Source=CHANDAKG-01-L\\SQLEXPRESS;initial catalog=Calculator;integrated security=true")) 
       { 
        con.Open(); 

        string query = @" SELECT * 
             FROM DataNorm 
             WHERE Provider= @name 
              AND year(DateMonth) = 2014 "; 

        var result = con.Query<SelectedDetails>(query, new { name = Name }); 

        return result; 
       } 
      } 
+1

其實如果有多個結果'SingleOrDefault'會拋出一個異常。 'FirstOrDefault'是你想要使用的,如果你想要第一個可能的零個或多個行的項目。 – juharr

+0

我試過你的解決方案@ Gustavo..Its不工作..它仍然返回NULL ..我連接到SQL在此之前調用的方法,那裏它工作正常,並返回結果.. –

0

github

注:所有的擴展方法假設的連接已經打開,如果連接被關閉,他們將失敗。