2017-07-17 1 views
0

J'appelle une procédure stockée à partir d'ASP.NET pour récupérer des données à stocker dans un tableau. Le problème est que pour retourner les valeurs dont j'ai besoin, je dois d'abord appeler une autre procédure stockée et vider les résultats dans une table temporaire. Cela génère les enregistrements corrects du côté SQL, mais lorsque je l'appelle dans ASP, il renvoie l'index du dernier enregistrement sous la forme d'un int. Ainsi, même si SQL génère les résultats corrects, ASP ne peut pas y accéder lors de l'appel de la procédure stockée.La procédure stockée renvoie le nombre de lignes à la place des valeurs de colonne

Voilà comment je mon SQL mis en place:

IF OBJECT_ID('#temp') IS NOT NULL 
    BEGIN 
     DROP TABLE #temp 
    END 

CREATE TABLE #temp 
(
EventID nvarchar(50), 
RunDate date, 
SectionCode nvarchar(50), 
SectionMapCode nvarchar(50), 
DispSort int, 
Capacity nvarchar(50), 
Attendance int, 
PctCap int, 
HeatColor nvarchar(50) 
) 

DECLARE @runDate date = GETDATE() 
--Insert results from killsheet sproc into temp table 
INSERT #temp Exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate; 

select Capacity from #temp; 

La sortie SQL:

enter image description here

L'appel ASP:

string option = TempData["option"].ToString(); 
var secCapacity = db.uspGetSecCapacityNew(option); 
ViewData["Capacity"] = secCapacity; 
System.Diagnostics.Debug.WriteLine("capacity " + secCapacity); 

Et la sortie ASP:

capacity 261

Notez comment secCapacity est égal à 261, qui est le dernier numéro de ligne dans le résultat SQL.

Alors, comment puis-je accéder aux résultats de la requête plutôt qu'à la taille des données?

+0

Le retour de procédure stockée est le nombre de lignes, pas le jeu de résultats. Qu'est-ce que 'db' ici? Ce cadre d'entité est-il – DavidG

+0

Correct, comment puis-je obtenir le jeu de résultats? Cela devrait fonctionner comme prévu avec un 'Select From ', non? –

+3

avez-vous besoin d'un 'set nocount on' en haut de votre proc-stocké? – DaveShaw

Répondre

0

Sans vouloir vous offenser, vous semblez ajouter une couche de complexité qui n'a pas besoin d'exister. Cette section:

DECLARE @runDate date = GETDATE() 
--Insert results from killsheet sproc into temp table 
INSERT #temp Exec GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate; 

select Capacity from #temp; 

Vous insérez dans un objet temporaire dans SQL Server avec un seul proc. Pourquoi ne pas simplement renvoyer ce proc dépendant? Est-ce une opération de mémoire très intensive en mémoire ou quelque chose qui nécessite un stockage temporaire? Sinon, je voudrais juste obtenir le résultat. Jongler entre le stockage temporaire et les ensembles de résultats renvoyés peut être problématique. Surtout quand vous traitez avec une couche de .NET traiter les déclarations qui sont soit:

  1. SQL dynamique
  2. stockage temporaire dans la tempdb (# ou ## tables)

Sauf si vous avez des règles strictes Je voudrais juste faire vos données de retour avec

GameDayReporting.dbo.uspGetEventKillSheetDetailedReport @EventID, @runDate 

WRAP une liste d'objets Poco si vous utilisez Entity Framework ou un DataTable si ADO.NET.

+0

Eh bien, nous utilisons une table temporaire car nous devons isoler une colonne à la fois. 'uspGetEventKillSheetDetailedReport' contient 5-6 colonnes dont nous n'avons pas besoin, donc notre plan était d'interroger' uspGetEventKillSheetDetailedReport' pour la colonne dont nous avons besoin, de la stocker dans une table temporaire, puis d'interroger la table temporaire car nous ne pouvons pas interroger une procédure stockée. –

+0

Vous pouvez garder les données en mémoire pour interroger plus tard ou utiliser une table permanente si vous allez faire après l'analyse du marché. Je ne stockerais pas de données dans le tempdb sur lequel vous reviendrez plus tard. Il s'agit généralement d'un stockage temporaire, d'où le nom. Si vous voulez vraiment faire un retour à partir d'un objet temporaire mais que vous voulez interroger cet objet plus tard, pourquoi ne pas créer une table permanente et l'étiqueter comme: 'stagingKillSheetDetailedReport'? Vous allez avoir des ennuis avec l'analyse des objets tempdb. C'est un niveau généralement réservé à SQL Server, pas à l'accès .NET. – djangojazz

+0

Je voulais utiliser la temp parce que si nous utilisions un db permanent, chaque fois que quelqu'un lancerait le programme, il génèrerait 261 entrées de plus à la table (et je le ferais pour 3 requêtes) pour que la mémoire soit vraiment intense. Nous avons trouvé un moyen de le faire en utilisant quelque chose comme 'de d dans ...... select new {d.capacity}'. Je posterai une réponse sous peu –

0

J'ai été capable de le résoudre en choisissant ma procédure stockée de ASP au lieu d'essayer d'importer des données spécifiques à partir de SQL.

var uspCapacity = from d in db.uspGetEventKillSheetDetailedReport(option, date) 
         select new 
         { 
          d.Capacity 
         }; 
    var uspAttendance = from d in db.uspGetEventKillSheetDetailedReport(option, date) 
         select new 
         { 
          d.Attendance 
         }; 
    var uspSectionMapCode = from d in db.uspGetEventKillSheetDetailedReport(option, date) 
         select new 
         { 
          d.SectionMapCode 
         }; 

    var uspCapacityList = uspCapacity.ToArray(); 
    var uspAttendanceList = uspAttendance.ToArray(); 
    var uspSectionMapCodeList = uspSectionMapCode.ToArray(); 

J'ai testé à l'aide:

for (var i = 0; i < 3; i++) 
    { 
     System.Diagnostics.Debug.WriteLine("Capacity " + uspCapacityList[i] + " Attendance " + uspAttendanceList[i] + " Section Map Code " + uspSectionMapCodeList[i]); 
    }