2011-11-14 78 views
1

我使用cloture.xsd。我把這個連接到我的報告Cloture_Tete。C#數據集SQL選擇

在SQL它的工作原理:

SELECT  NO_ORDRE, CODE_CLIENT, CODE_DEST, STATUT_ORDRE, RS_NOM, ADRESSE, CP, VILLE, PAYS, INSEE, SIRET, TEL, FAX, EMAIL, ENLEV_UNITE, ENLEV_CREMB, 
         ENLEV_DECL, MODAL_MODE, MODAL_PORT, MODAL_SPEC, LIVRS_EXPRS, LIVRS_SIGN, LIVRS_SAMD, NBR_COLIS, POID, POID_COR, CODE_MAG, OBS, 
         DATE_CREE, DATE_MODIF, CREE_PAR, MODIF_PAR, REF_EXPED, AUTRE_REF, DATE_CLOTUR, AGENCE, TRANSPORTEUR, CHAUFFEUR, FACTURATION 
FROM   ORDRE 
WHERE  (STATUT_ORDRE = 2) AND (TRANSPORTEUR IN (1, 2)) 

,但是當我通過C#做:

protected void Page_Load(object sender, EventArgs e) 
    { 
     string CHAUFFEUR = Request.QueryString["CHAUFFEUR"]; 
     string CODE_CLIENT = Request.QueryString["ClientID"]; 
     string ClotList = Request.QueryString["ClotList"]; 
     try 
     { 
      using (var connectionWrapper = new Connexion()) 
      { 
       ReportViewer_Cloture.Report = new Cloture_Tete(Convert.ToInt32(CHAUFFEUR), CODE_CLIENT, ClotList); 


      } 
     } 
     catch (Exception excThrown) 
     { 
      throw new Exception(excThrown.Message); 
     } 
    } 

與我的預定義選擇cloture.xsd:

SELECT ADRESSE, AGENCE, AUTRE_REF, CHAUFFEUR, CODE_CLIENT, CODE_DEST, CODE_MAG, CP, CREE_PAR, DATE_CLOTUR, DATE_CREE, DATE_MODIF, EMAIL, ENLEV_CREMB, ENLEV_DECL, ENLEV_UNITE, FACTURATION, FAX, INSEE, LIVRS_EXPRS, LIVRS_SAMD, LIVRS_SIGN, MODAL_MODE, MODAL_PORT, MODAL_SPEC, MODIF_PAR, NBR_COLIS, NO_ORDRE, OBS, PAYS, POID, POID_COR, REF_EXPED, RS_NOM, SIRET, STATUT_ORDRE, TEL, TRANSPORTEUR, VILLE FROM ORDRE WHERE (STATUT_ORDRE = 2) AND (TRANSPORTEUR IN (@Trans)) 

,我期待與我產生的SQL Profiler:

exec sp_executesql N'SELECT ADRESSE, AGENCE, AUTRE_REF, CHAUFFEUR, CODE_CLIENT, CODE_DEST, CODE_MAG, CP, CREE_PAR, DATE_CLOTUR, DATE_CREE, DATE_MODIF, EMAIL, ENLEV_CREMB, ENLEV_DECL, ENLEV_UNITE, FACTURATION, FAX, INSEE, LIVRS_EXPRS, LIVRS_SAMD, LIVRS_SIGN, MODAL_MODE, MODAL_PORT, MODAL_SPEC, MODIF_PAR, NBR_COLIS, NO_ORDRE, OBS, PAYS, POID, POID_COR, REF_EXPED, RS_NOM, SIRET, STATUT_ORDRE, TEL, TRANSPORTEUR, VILLE FROM ORDRE WHERE (STATUT_ORDRE = 2) AND (TRANSPORTEUR IN (@Trans))',N'@Trans varchar(50)',@Trans='1,2' 

那不行,爲什麼不同的只是在SQL (TRANSPORTEUR IN (1, 2))(TRANSPORTEUR IN (@Trans))',N'@Trans varchar(50)',@Trans='1,2'

感謝您提前

回答

2

當您使用IN (@Trans),你說的(基本上)IN ('1,2'),這是說IN (1,2)很大的不同。具體而言,它與單個字符串進行比較,而不是多個值。有許多「分離」UDF實現,您可能會發現它們很有用(即調用UDF和內部連接到數據)。

+0

感謝您的回覆。你能給我一個提示嗎?我如何構建一個(1,2)?我應該在C#端還是SQL端工作? – user609511

+0

@ user609511它取決於可用的工具; p字符串串聯有點危險,除非你知道**內容是安全的。通常,您需要TSQL才能擁有正確數量的元素。我們自己的工具(dapper)爲我們做了這個工作,使我們能夠使用「where @ in @foo」(它添加括號並從列表中擴展參數等)。更一般地說,UDF方法非常普遍且安全 –