2009-08-21 3 views
0

Ce que j'ai essayé de faire est de générer un fichier texte sur ASP.Net en utilisant C#. Les données sont extraites d'une base de données en exécutant une procédure stockée. Je me suis assuré que les procédures stockées renvoyaient des valeurs en l'exécutant dans le serveur SQL Mangement Studio. J'étais en mesure de le faire.Pourquoi certaines procédures stockées ne renvoient pas de données dans ASP.Net C#

Je commence par regrouper toutes les tables associées dans une vue, puis utilise une procédure stockée pour obtenir des données de cette vue. Générez ensuite ces données dans un fichier texte dans ASP.Net. en utilisant le code suivant:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Name"].ConnectionString); 
conn.Open(); 
SqlCommand cmd = new SqlCommand("Stored Procedure Name", conn); 
cmd.CommandType = CommandType.StoredProcedure; 
SqlDataAdapter myAdapter = new SqlDataAdapter(cmd);   
DataTable dt = new DataTable(); 
myAdapter.Fill(dt);   
System.Text.StringBuilder strResult = new System.Text.StringBuilder(""); 
string createtext = (Server.MapPath("./Feeds/") + "feed.txt"); 
StreamWriter w = File.CreateText(createtext); 
w.Flush(); 
w.Close(); 

J'ai également veillé à ce que chaque affichage renvoie également des valeurs (dans SQL Server Management Studio).

Mais le problème est que toutes les procédures stockées n'ont pas renvoyé des valeurs sur ASP.Net. Je n'ai que le fichier texte vide même si toutes les procédures stockées ont renvoyé des valeurs dans SQL Server Management Studio.

J'utilise seulement une simple déclaration de sélection dans les procédures stockées comme

select Somthing 
from View_Name 

Cette requête retourne une valeur dans le Management Studio, mais pas ASP.Net (pour certaines procédures stockées).

Quel pourrait être le problème pour ce problème? S'il vous plaît aider

+0

Qu'y at-il en fait dans le fichier? – Yuliy

Répondre

3

Je ne vois pas où vous avez pris les données dans votre DataTable et le mettre dans le fichier texte.

EDIT:

Puisque vous avez montré votre code dans les commentaires:

Il semble que vous avalez vos exceptions. Si vous étiez juste en train de quitter le code par souci de brièveté, mais sinon, vous pourriez cacher une erreur sur l'instruction catch puisque vous ne faites rien avec l'exception. Par exemple, vous pourriez avoir un problème de permissions sur un SP ou un View et vous ne le connaissez pas.

Si ce n'est pas le cas, alors: Déboguer/ajouter un point d'arrêt pour ce code pour voir si le datatable contient des données.

Vous pouvez également utiliser SQL Profiler pour voir ce qui arrive à SQL Server à partir de votre code.

+0

Vous devez copier les données du DataTable dans le fichier. Cela n'arrive pas. –

+0

Désolé, je n'ai pas mis des parties de code. Voici où je prends les données de la datatable, et mettre dans le fichier texte: essayez { foreach (DataRow dr en dt.Rows) { pour (int col = 0; col

+0

Avez-vous débogué/ajouté un point d'arrêt pour ce code pour voir si le datatable a des données? Êtes-vous en train d'avaler des exceptions (genre de look de votre extrait de code)? Par exemple, pourriez-vous avoir un problème de permissions sur quelques-uns de ces SP et/ou vues. Vous pouvez également utiliser SQL Profiler pour voir ce qui arrive à SQL Server à partir de votre code. – klabranche

2

En plus du fait évident que vous n'utilisez pas les données que vous avez extraites de la base de données, votre code peut perdre des ressources si des exceptions sont levées. Il doit être écrit comme suit pour éviter que:

using (SqlConnection conn = new SqlConnection(
     ConfigurationManager.ConnectionStrings["Name"].ConnectionString)) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand("Stored Procedure Name", conn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     using (SqlDataAdapter myAdapter = new SqlDataAdapter(cmd)) 
     { 
      using (DataTable dt = new DataTable()) 
      { 
       myAdapter.Fill(dt); 
      } 
     } 
    } 
} 

System.Text.StringBuilder strResult = new System.Text.StringBuilder(""); 
string createtext = (Server.MapPath("./Feeds/") + "feed.txt"); 
using (StreamWriter w = File.CreateText(createtext)) 
{ 
    // Do something with w 
    w.Flush(); 
} 
+0

merci John pour une version plus sécurisée du code. De toute évidence, j'ai beaucoup à apprendre –

0

Avez-vous débogué/ajouté un point d'arrêt pour ce code pour voir si le datatable dispose de données? Êtes-vous en train d'avaler des exceptions (genre de look de votre extrait de code)? Par exemple, pourriez-vous avoir un problème de permissions sur quelques-uns de ces SP et/ou vues. Vous pouvez également utiliser SQL Profiler pour voir ce qui arrive à SQL Server à partir de votre code

Merci les gars. Je suis retourné et j'ai vraiment regardé les vues que j'utilisais. Comme je l'ai mentionné plus tôt, certaines procédures stroed retourneraient des données sur les fichiers texte, d'autres pas.

Dans mon cas, il semblait que les procédures stockées qui ont récupéré des données à partir de vues qui impliquaient la fonction définie par l'utilisateur renverraient un fichier vide (le problème auquel je suis confronté) Et pour cette procédure stockée particulière; la datatable était vide après ce code: myAdapter.Fill (dt); Ce qui explique pourquoi j'ai obtenu le texte en blanc.

J'ai également regardé dans SQL Profiler, il a exécuté la procédure stockée une fois que le bouton "Générer du texte" sur ASP.Net a été cliqué. Mais il n'y avait pas de données retournées.

Est-il possible que l'UDF a causé mon problème. Le problème est-il en quelque sorte lié à l'autorisation UDF. Je pense que la permission pourrait être la cause du problème. Comment puis-je accorder à ASP.Net l'autorisation d'extraire des données de la procédure stockée contenant le fichier UDF.

Remarque: Le fichier UDF est créé par d'autres développeurs.

Merci. Aein

Questions connexes