2016-03-28 16 views
0

Dapper ORMを使用して、オブジェクトのコレクションをフィルタリングおよび取得しています。ときに私はSQLエラーを取得している日付でオブジェクトをフィルタリングしようとしています。しかし、同じクエリが2012以下のSQLサーバーに最適な実行されていることは私のコードはDapper ORMで2つの日付の間でデータをフィルタリングする

   DataTableSettings DS = new DataTableSettings(); 
       DataTableElements DataTableElements = new DataTableElements(); 
       DataTableElements.Limit = param.iDisplayLength; 
       DataTableElements.Start = param.iDisplayStart; 
       DataTableElements.SortColumn = "a.Ser_Id"; //default sorting column 
       DataTableElements.AType = "DESC"; 
       DataTableElements.ListingFields = "Ser_SlNo,a.Ser_Id as SERID,a.Ser_LogNo AS SLNO,Cas_Name,a.Ser_CallReason AS RSON," + 
                "Ser_AssignedTo,Ser_CallTime,Ser_CallDate,a.Cus_Id AS CUSID,a.Cas_Id AS CSID," + 
                "Cus_Name,Add_Landmark,a.Prm_Id AS PRMID,Prm_Model, c.Cut_Id AS CUTID,Cut_Name"; 
       DataTableElements.TableName = "ServiceCalls as a inner join CallStatus as b on a.Cas_Id = b.Cas_Id" + 
                "inner join Customers as c on a.Cus_Id = c.Cus_Id" + 
                "inner join Products as d on a.Prd_Id = d.Prd_Id" + 
                "inner join AddressDetailes as e on a.Add_id = e.Add_id" + 
                "inner join Companies as f on a.Com_Id = f.Com_Id" + 
                "inner join ProductModels as g on a.Prm_Id = g.Prm_Id" + 
                "inner join ProductSerials as h on a.Prs_Id = h.Prs_Id" + 
                "inner join CustomerTypes as i on c.Cut_Id = i.Cut_Id" + 
                "inner join UserServices as j on a.Ser_Id = j.Ser_Id" + 
                "where CONVERT(date, Ser_CallDate,101) BETWEEN CONVERT(date,'3/1/2016 12:00:00 AM', 101) AND CONVERT(date,'3/31/2016 12:00:00 AM', 101)" + 
                "and j.Usr_Id = 21"; 
        var str = DS.GetDataTableElements(DataTableElements); 


public dynamic GetDataTableElements(DataTableElements DataTableElements) 
     { 
      _db = new SqlConnection(db.Database.Connection.ConnectionString); 
      string Sql = "exec SelectFomTable @TableName ='" + DataTableElements.TableName + "',@Limit =" + DataTableElements.Limit + ",@Start =" + DataTableElements.Start + ",@SortColumn ='" + DataTableElements.SortColumn + "' "; 

      Sql += ",@ListingFields='" + DataTableElements.ListingFields + "'"; 
      Sql += ",@AType='" + DataTableElements.AType + "'"; 
      Sql += ",@Filter='" + DataTableElements.Filter + "'"; 
      dynamic retuns = _db.Query<dynamic>(Sql).ToList(); 
      return retuns; 
     } 

あると

ALTER PROCEDURE [dbo].[SelectFomTable] 
-- Add the parameters for the stored procedure here 
(@TableName varchar(max),@Limit Int=10,@Start int=0,@SortColumn varchar(50),@Filter varchar(max)=null,@ListingFields varchar(max)=null,@AType varchar(max)=null) 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 
Declare @sts varchar(max); 
Declare @List varchar(max); 
Declare @Assend varchar(max); 
Declare @End int ; 
set @End [email protected][email protected]; 
set @List =isnull(@ListingFields,'*'); 
set @Assend =isnull(@AType,'ASC'); 
set @sts= 'WITH tab as (select ROW_NUMBER() OVER(ORDER BY '[email protected]+' '[email protected]+') AS RowIncrement, '[email protected]+' from '[email protected][email protected]+' ), 
    tab1 as (select count(*) as TotalCount from '[email protected][email protected]+') 
       select * from tab,tab1 where RowIncrement between '+CONVERT(varchar(10), @Start) +' and '+CONVERT(varchar(10), @End); 
    set @[email protected][email protected]; 
--if (@Filter is not null) 
--begin 
--set @[email protected][email protected]; 
--end 
print @sts; 
    exec(@sts); 

を次のように私のストアドプロシージャがあると

{"Incorrect syntax near '3'."} 
を次のように私は取得しています誤りがあります

助けてください.....

+2

を返却する必要がある場合、私はあなたがそれぞれに/どこラインのニーズに参加することを考えるしかし場合は、ここでDapperのために関連したものを見ることができません次の行を連結する前にスペースを入力すると、構文エラーの説明が表示されます。入力エラーとして閉じます – Steve

+0

私は上記のSQLクエリを使用してデータベースからデータを取得していますが、エラーが発生しています。連結前にスペースを追加しても、同じエラーが表示されます。 –

+0

私はここで大胆には見ません。 Proのヒント:単純な文字列と連結を使用すると、SQLを読むのは難しいです。はるかに良いアイデアは、*逐語的な文字列リテラル*を使用することです、そして、文字列の中にline-brraks *を視覚的に含めることができます。 '@" blah ... blah ... blah "'を使うだけで、文字列のどこにでも改行を入れることができます。問題が文字列に関連している場合は、これが役に立ちます。 –

答えて

1

私が正しく理解しているのは、ソートされたd ata from sql。 はい、そのように行う場合:

private DataTable Method() 
    { 
     string connectionStringSQL = "Your connection string"; 
     string query = @"SELECT Ser_SlNo, a.Ser_Id AS SERID, a.Ser_LogNo AS SLNO, Cas_Name 
           ,a.Ser_CallReason AS RSON, Ser_AssignedTo, Ser_CallTime 
           ,Ser_CallDate, a.Cus_Id AS CUSID, a.Cas_Id AS CSID, Cus_Name 
           ,Add_Landmark, a.Prm_Id AS PRMID, Prm_Model, c.Cut_Id AS CUTID, Cut_Name 
         FROM ServiceCalls AS a 
           INNER JOIN CallStatus AS b ON a.Cas_Id = b.Cas_Id 
           INNER JOIN Customers AS c ON a.Cus_Id = c.Cus_Id 
           INNER JOIN Products AS d ON a.Prd_Id = d.Prd_Id 
           INNER JOIN AddressDetailes AS e ON a.Add_id = e.Add_id 
           INNER JOIN Companies AS f ON a.Com_Id = f.Com_Id 
           INNER JOIN ProductModels AS g ON a.Prm_Id = g.Prm_Id 
           INNER JOIN ProductSerials AS h ON a.Prs_Id = h.Prs_Id 
           INNER JOIN CustomerTypes AS i ON c.Cut_Id = i.Cut_Id 
           INNER JOIN UserServices AS j ON a.Ser_Id = j.Ser_Id 
         WHERE (
            CONVERT(DATETIME ,Ser_CallDate ,101) BETWEEN '3/1/2016 12:00:00 AM' 
            AND '3/31/2016 12:00:00 AM' 
           ) 
           AND j.Usr_Id = 21 
         ORDER BY a.Ser_Id DESC"; 
     DataTable dt = new DataTable(); 
     using (SqlConnection sqlConnection = new SqlConnection(connectionStringSQL)) 
     { 
      SqlDataAdapter adapter = new SqlDataAdapter(query, sqlConnection); 

      sqlConnection.Open(); 
      adapter.Fill(dt); 
     } 

     return dt; 
    } 

そして、あなたがリストに

private dynamic Method() 
    { 
     ..... 

     using (SqlConnection sqlConnection = new SqlConnection(connectionStringSQL)) 
     { 
      SqlDataAdapter adapter = new SqlDataAdapter(query1, sqlConnection); 

      sqlConnection.Open(); 
      adapter.Fill(dt); 
     } 

     var list = dt.AsEnumerable().ToList(); 

     return list; 
    } 
関連する問題