2017-02-09 1 views
0

L'utilisation de la boucle while dans la procédure stockée fonctionne correctement dans le serveur SQL mais renvoie uniquement la première ligne à la vue de grille asp.net.Alors qu'une boucle dans une procédure stockée dans sql renvoie une seule ligne à la vue de la grille dans asp.net

Ma procédure stockée

create procedure [dbo].[DoorDetails] 
@emp varchar(16), 
@fromdate datetime, 
@todate datetime, 
@cdate datetime [email protected] 
as 
while @cdate<= @todate 
Begin 
    select convert(varchar,(CONVERT(date,@cdate,103)),103) as Date, Empname, min(TransactionDateTime) as EntryTime ,max(TransactionDateTime) as ExitTime, 
    (DateDIFF (MINUTE,min(TransactionDateTime), max(TransactionDateTime)))/60 as Hours, 
    (DateDIFF (MINUTE,min(TransactionDateTime), max(TransactionDateTime)))%60 as minutes from 
    ceptEmpTxn where EmpName = @emp and cast(TransactionDateTime as Date)=cast(@cdate as date) group by empname 
    SET @cdate = DATEADD(dd,1,@cdate) 

end 

GO 

de résultats dans SQL

------------------------------------------------------------------------------------------------------------- 
|Date|   |Empname|  |EntryTime|    |ExitTime|   |Hours| minutes| 
|14/09/2016| |PRAVEEN KUMAR| |2016-09-14 09:28:13.000||2016-09-14 18:42:14.000 9 14 

------------------------------------------------------------------------------------------------------------ 
|Date|   |Empname|  |EntryTime|    |ExitTime|   |Hours| minutes| 

|15/09/2016| |PRAVEEN KUMAR| |2016-09-15 09:27:13.000||2016-09-15 17:16:46.000 7 49 

------------------------------------------------------------------------------------------------------------- 
|Date|   |Empname|  |EntryTime|    |ExitTime|   |Hours| minutes| 
|16/09/2016| |PRAVEEN KUMAR| |2016-09-16 09:30:33.000||2016-09-16 19:03:14.000 9 33 

têtes se répètent à chaque fois dans SQL

Résultat dans la page Web (en utilisant en mode Grille)

------------------------------------------------------------------------ 
Date|  Empname|  EntryTime|    ExitTime|   Hours| minutes| 
15/09/2016| PRAVEEN KUMAR| 15-09-2016 09:27:07| 15-09-2016 17:16:46| 7|  49| 

Mon f Onction dans asp.net

public DataTable tottime(string empname, DateTime fromdate, DateTime todate) 
{ 
    System.Data.SqlClient.SqlConnection myConn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["ceptConnectionString"].ConnectionString.ToString()); 
    DataTable myDt = new DataTable(); 
    System.Data.SqlClient.SqlCommand myCmd = new System.Data.SqlClient.SqlCommand(); 
    myCmd.CommandType = System.Data.CommandType.StoredProcedure; 
    System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(); 
    myCmd.CommandText = "DoorDetails"; 
    myCmd.Parameters.AddWithValue("@emp", empname); 
    myCmd.Parameters.AddWithValue("@fromdate", fromdate); 
    myCmd.Parameters.AddWithValue("@todate", todate); 
    da.SelectCommand = myCmd; 
    try 
    { 
     myCmd.Connection = myConn; 
     da.Fill(myDt); 
     return myDt; 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
    finally 
    { 
     myDt = null; 
     da.Dispose(); 
     myCmd.Dispose(); 
     myConn.Close(); 
     myConn.Dispose(); 
    } 

} 

Comment retourner toutes les valeurs de procédure stockée également comment avoir en-tête de la table qu'une seule fois suivi de toutes les lignes.

+0

Avez-vous pu utiliser le SP ci-dessous? – balaji

+0

Oui la procédure stockée fonctionne correctement. La requête donne la sortie requise dans le serveur SQL mais le résultat attendu n'est pas obtenu en mode grille. – praveenrsmart

+0

Dans SQL Server, pouvez-vous l'obtenir en tant que jeu de résultats unique? au lieu de grilles? – balaji

Répondre

1

Il est possible que vous ayez à créer une variable de table et à stocker le jeu de résultats là-bas et à nouveau récupérer ce jeu de résultats à la fin. Essaye ça.

P.S Veuillez modifier les types de données des colonnes de la variable table (@t) en conséquence. Alors qu'il n'y aura pas de problèmes.

create procedure [dbo].[DoorDetails] 
@emp varchar(16), 
@fromdate datetime, 
@todate datetime, 
@cdate datetime [email protected] 
as 
while @cdate<= @todate 
Begin 
DECLARE @T TABLE 
(
    [Date] Date 
    ,Empname VARCHAR(200) 
    ,EntryTime DATETIME 
    ,ExitTime DATETIME 
    ,[Hours] INT 
    ,[minutes] INT 
) 

INSERT INTO @T 
    select convert(varchar,(CONVERT(date,@cdate,103)),103) as Date 
    , Empname, min(TransactionDateTime) as EntryTime 
    ,max(TransactionDateTime) as ExitTime 
    ,(DateDIFF (MINUTE,min(TransactionDateTime), max(TransactionDateTime)))/60 as Hours 
    ,(DateDIFF (MINUTE,min(TransactionDateTime), max(TransactionDateTime)))%60 as minutes 
    from 
    ceptEmpTxn where EmpName = @emp and cast(TransactionDateTime as Date)=cast(@cdate as date) group by empname 

    SET @cdate = DATEADD(dd,1,@cdate) 

end 
SELECT * FROM @T 

GO 
+0

devrions-nous déclarer la table à l'intérieur tout en boucle? il montre quelques erreurs de conversion Je ne fais qu'essayer – praveenrsmart

+0

Oui, vous devez le déclarer dans la boucle, que les erreurs de conversion peuvent être dues à des types de données inappropriés dans la table @t. Changez-les en conséquence – balaji

+0

juste [Date] devrait être dans char (10) datataype et son fonctionnement à la fois dans SQL Server et Gridview – praveenrsmart