SqlDataReader 不工作 - 不读取数据

use*_*628 5 c# sql-server sqldatareader

我有一个SqlDataReader,但它永远不会进入Read()

\n\n

当我调试它时,它通过了循环while(readerOne.Read())。即使有数据,它也不会进入这个循环。

\n\n
public static List<Pers_Synthese> Get_ListeSynthese_all(string codeClient, DateTime DateDeb, DateTime DateFin)\n{\n   try\n   {\n      using (var connectionWrapper = new Connexion())\n      {\n         var connectedConnection = connectionWrapper.GetConnected();\n\n         string sql_Syntax = Outils.LoadFileToString(Path.Combine(appDir, @"SQL\\Get_ListeSynthese_All.sql"));\n\n         SqlCommand comm_Command = new SqlCommand(sql_Syntax, connectionWrapper.conn);\n         comm_Command.Parameters.AddWithValue("@codeClioent", codeClient);\n         comm_Command.Parameters.AddWithValue("@DateDeb", DateDeb);\n         comm_Command.Parameters.AddWithValue("@DateFin", DateFin);\n\n         List<Pers_Synthese> oListSynthese = new List<Pers_Synthese>();\n\n         SqlDataReader readerOne = comm_Command.ExecuteReader();\n\n         while (readerOne.Read())\n         {\n            Pers_Synthese oSyntehse = new Pers_Synthese();\n            oSyntehse.CodeTrf = readerOne["CODE_TARIF"].ToString();\n            oSyntehse.NoLV = readerOne["NOID"].ToString();\n            oSyntehse.PrxUnitaire = readerOne["PRIX_UNITAIRE"].ToString();\n            oSyntehse.ZoneId = readerOne["LE_ZONE"].ToString();\n            oSyntehse.LeZone = readerOne["LIB_ZONE"].ToString();\n            oSyntehse.LeDept = readerOne["DEPT"].ToString();\n            oSyntehse.LeUnite = readerOne["ENLEV_UNITE"].ToString();\n            oSyntehse.LePoids = Convert.ToInt32(readerOne["POID"]);\n            //oSyntehse.LePoidsCorr = Convert.ToInt32(readerOne["POID_CORR"]);\n            oSyntehse.LeColis = readerOne["NBR_COLIS"].ToString();\n            oSyntehse.LeCr = readerOne["NBR_CREMB"].ToString();\n            oSyntehse.SumMontantCR = readerOne["ENLEV_CREMB"].ToString();\n            oSyntehse.LeVd = readerOne["NBR_DECL"].ToString();\n            oSyntehse.SumMontantVD = readerOne["ENLEV_DECL"].ToString();\n            oSyntehse.LePrixHT = readerOne["PRIX_HT"].ToString();\n            oSyntehse.LePrixTTC = readerOne["PRIX_TTC"].ToString();\n            oSyntehse.TrDeb = readerOne["TR_DEB"].ToString();\n            oSyntehse.TrFin = readerOne["TR_FIN"].ToString();\n\n            oListSynthese.Add(oSyntehse);\n         }\n         readerOne.Close();\n         readerOne.Dispose();\n         return oListSynthese;\n      }\n  }\n  catch (Exception excThrown)\n  {\n     throw new Exception(excThrown.Message);\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我使用 SQL Server Profiler 调试它时,它显示数据......这意味着数据不为空,但它永远不会进入此循环。

\n\n
while (readerOne.Read())\n{\n
Run Code Online (Sandbox Code Playgroud)\n\n

顺便说一下我的连接类:

\n\n
 class Connexion : IDisposable \n    {\n        public SqlConnection conn;\n        public SqlConnection GetConnected()\n        {\n            try\n            {\n                string strConnectionString = Properties.Settings.Default.Soft8Exp_ClientConnStr;\n                conn = new SqlConnection(strConnectionString);\n            }\n            catch (Exception excThrown)\n            {\n                conn = null;\n                throw new Exception(excThrown.InnerException.Message, excThrown);\n            }\n\n            // Ouverture et restitution de la connexion en cours\n            if (conn.State == ConnectionState.Closed) conn.Open();\n            return conn;\n        }\n\n        public Boolean IsConnected\n        {\n            get { return (conn != null) && (conn.State != ConnectionState.Closed) && (conn.State != ConnectionState.Broken); }\n        }\n\n        public void CloseConnection()\n        {\n            // Lib\xc3\xa9ration de la connexion si elle existe\n            if (IsConnected)\n            {\n                conn.Close();\n                conn = null;\n\n            }\n\n        }\n\n        public void Dispose()\n        {\n            CloseConnection();\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

和我的 SQL 语句:

\n\n
exec sp_executesql N\'SELECT CODE_TARIF,PRIX_UNITAIRE,TR_DEB,TR_FIN,LE_ZONE,T_TARIF_ZONE.LIBELLE as LIB_ZONE,\n  SUBSTRING(CP_DEST,1,2) as DEPT,T_UNITE.LIBELLE as ENLEV_UNITE,\n  count(NOID)as NOID,\n   SUM(CASE WHEN POID_CORR IS NOT NULL THEN POID_CORR ELSE POID END) as POID,sum(NBR_COLIS)as NBR_COLIS,COUNT(NULLIF(ENLEV_CREMB,0))as NBR_CREMB, sum(ENLEV_CREMB)as ENLEV_CREMB,COUNT(NULLIF(ENLEV_DECL,0))as NBR_DECL,sum(ENLEV_DECL)as ENLEV_DECL,sum(PRIX_HT)as PRIX_HT,sum(PRIX_TTC)as PRIX_TTC, sum (POID_CORR)as POID_CORR\n  FROM LETTRE_VOIT_FINAL\n   LEFT JOIN T_TARIF_ZONE ON LETTRE_VOIT_FINAL.LE_ZONE = T_TARIF_ZONE.NO_ID\n  LEFT JOIN T_UNITE ON LETTRE_VOIT_FINAL.ENLEV_UNITE = T_UNITE.NO_ID\n  where code_client = @codeClioent\n   and DATE_CLOTUR_REEL BETWEEN @DateDeb AND @DateFin\n   and STATUT_LV = 2\n\n group by CODE_TARIF,PRIX_UNITAIRE,TR_DEB,TR_FIN,LE_ZONE,T_TARIF_ZONE.LIBELLE,SUBSTRING(CP_DEST,1,2),T_UNITE.LIBELLE\n order by LE_ZONE,PRIX_UNITAIRE\n\n\',N\'@codeClioent nvarchar(8),@DateDeb datetime,@DateFin datetime\',@codeClioent=N\'17501613\',@DateDeb=\'2013-06-05 00:00:00\',@DateFin=\'2013-06-05 23:59:00\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

它返回 SQL 探查器上的数据:\n在此输入图像描述

\n\n

我真正的查询:

\n\n
SELECT CODE_TARIF,PRIX_UNITAIRE,TR_DEB,TR_FIN,LE_ZONE,T_TARIF_ZONE.LIBELLE as LIB_ZONE,\n  SUBSTRING(CP_DEST,1,2) as DEPT,T_UNITE.LIBELLE as ENLEV_UNITE,\n  count(NOID)as NOID,\n   SUM(CASE WHEN POID_CORR IS NOT NULL THEN POID_CORR ELSE POID END) as POID,sum(NBR_COLIS)as NBR_COLIS,COUNT(NULLIF(ENLEV_CREMB,0))as NBR_CREMB, sum(ENLEV_CREMB)as ENLEV_CREMB,COUNT(NULLIF(ENLEV_DECL,0))as NBR_DECL,sum(ENLEV_DECL)as ENLEV_DECL,sum(PRIX_HT)as PRIX_HT,sum(PRIX_TTC)as PRIX_TTC, sum (POID_CORR)as POID_CORR\n  FROM LETTRE_VOIT_FINAL\n   LEFT JOIN T_TARIF_ZONE ON LETTRE_VOIT_FINAL.LE_ZONE = T_TARIF_ZONE.NO_ID\n  LEFT JOIN T_UNITE ON LETTRE_VOIT_FINAL.ENLEV_UNITE = T_UNITE.NO_ID\n  where code_client = @codeClioent\n   and DATE_CLOTUR_REEL BETWEEN @DateDeb AND @DateFin\n   and STATUT_LV = 2\n\n group by \n\n    CODE_TARIF,PRIX_UNITAIRE,TR_DEB,TR_FIN,LE_ZONE,T_TARIF_ZONE.LIBELLE,SUBSTRING(CP_DEST,1,2),T_UNITE.LIBELLE\n     order by LE_ZONE,PRIX_UNITAIRE\n
Run Code Online (Sandbox Code Playgroud)\n\n

这很奇怪......当数据介于以下之间时:

\n\n
DATE_CLOTUR_REEL BETWEEN \'2013-06-05 00:00:00\' and \'2013-06-05 23:59:00\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
DATE_CLOTUR_REEL BETWEEN \'2013-06-01 00:00:00\' and \'2013-06-05 23:59:00\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

有用。

\n

AAl*_*rez 4

事情本应如此。您没有执行“connection.Open() 同时设置连接字符串”。

   private static void ReadOrderData(string connectionString)
    {
        string queryString =
            "SELECT OrderID, CustomerID FROM dbo.Orders;";

        using (SqlConnection connection =
                   new SqlConnection(connectionString))
        {
            SqlCommand command =
                new SqlCommand(queryString, connection);
            connection.Open();

            SqlDataReader reader = command.ExecuteReader();

            // Call Read before accessing data. 
            while (reader.Read())
            {
                ReadSingleRow((IDataRecord)reader);
            }

            // Call Close when done reading.
            reader.Close();
        }
 }
Run Code Online (Sandbox Code Playgroud)

如何做到这一点的完美示例属于MSDN - 微软网站

注意:

        SqlCommand command =
            new SqlCommand(queryString, connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
  1. 创建SqlCommand
  2. 然后打开连接

您正在以另一种方式执行此操作,打开它然后创建命令。

我也没有看到你在哪里设置查询字符串,我只是看到你添加了参数;你错过了吗?

  • 我假设应用了连接字符串并且包装器类打开了连接。否则他们会得到一个异常,而不仅仅是没有行。 (2认同)