2016-03-28 24 views
0

Nesnelerin toplanması ve filtrelenmesi için Dapper ORM kullanıyorum. Nesneleri tarihe göre filtrelemeye çalıştığımda SQL hatası alıyorum. ancak aynı sorgu SQL server aşağıda 2012. mükemmel çalışan kodumDapper ORM'deki İki Tarih Arasındaki Verileri Süzme

   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; 
     } 

ve

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); 

takip eder ve

{"Incorrect syntax near '3'."} 
şöyle ı alıyorum hatadır olarak benim saklı işlemdir

lütfen yardım .....

+2

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; } 
Bir sonraki satırı birleştirmeden önce bir alan, sözdizimi hatasının olası bir açıklamasını alacaktır. Tipografik hata olarak kapatılıyor – Steve

+0

Veritabanından veri almak için yukarıdaki SQL sorgusunu kullanıyorum, sorgu alma hatası, bitmeden önce alan ekleyin ama yine de aynı hatayı alıyorum. –

+0

Burada hiç delici görmüyorum. Pro ipucu: Basit dizeleri ve birleştirme kullandığınızda SQL'i okumak gerçekten zor. Çok daha iyi bir fikir, bir * verbatim dizgi literal * kullanmaktır, daha sonra, görsel olarak dizgenin içinde satır-brraks * içerebilir. Sadece '@' kullanın ... blah ... blah ... blah ''ve dize içinde herhangi bir yere satır sonları koyabilirsiniz. Sorun dizelerle ilgili ise: Bu yardımcı olacaktır. –

cevap

1

Eğer doğru bir şekilde anlıyorsam asıl soru, sql'den atamak. evet o zaman böyle yaparsanız:

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; 
    } 

Ve listele'yi dönmek gerekirse

Ben her/nerede hat ihtiyaçlarını katılmak olduğunu düşünün, ancak eğer burada dapper ilgili bir şey göremiyorum
İlgili konular