2010-12-07 24 views
0

J'ai une fonction pour retourner la liste des tables ayant une clé primaire dans un datatable, mais maintenant le besoin est d'obtenir la liste de la table dans le type de retour de la chaîne.Besoin de convertir le type de retour DataTable en chaîne

Ma méthode est la suivante:

public DataTable GetAllPrimaryKeyTables 
    (string localServer, string userName, string password, string selectedDatabase) 
{ 

    // Create the datatable 
    DataTable dtListOfPrimaryKeyTables = new DataTable("tableNames"); 

    SqlConnectionStringBuilder objConnectionString = new SqlConnectionStringBuilder(); 
    objConnectionString.DataSource = localServer; ; 
    objConnectionString.UserID = userName; 
    objConnectionString.Password = password; 
    objConnectionString.InitialCatalog = selectedDatabase; 

    // Query to select primary key tables. 
    string selectPrimaryKeyTables = @"SELECT 
              TABLE_NAME 
              AS 
              TABLES 
             FROM 
              INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
             WHERE 
              CONSTRAINT_TYPE = 'PRIMARY KEY' 
            ORDER BY 
              TABLE_NAME"; 

    // put your SqlConnection and SqlCommand into using blocks! 
    using(SqlConnection sConnection = new SqlConnection(objConnectionString.ConnectionString)) 
    using(SqlCommand sCommand = new SqlCommand(selectPrimaryKeyTables, sConnection)) 
    { 
     try 
     { 
      // Create the dataadapter object 
      SqlDataAdapter sDataAdapter = new SqlDataAdapter(selectPrimaryKeyTables, sConnection); 

      // Fill the datatable - no need to open the connection, the SqlDataAdapter will do that all by itself 
      // (and also close it again after it is done) 
      sDataAdapter.Fill(dtListOfPrimaryKeyTables); 

     } 
     catch(Exception ex) 
     { 
      //All the exceptions are handled and written in the EventLog. 
      EventLog log = new EventLog("Application"); 
      log.Source = "MFDBAnalyser"; 
      log.WriteEntry(ex.Message); 
     } 
    } 

    // return the data table to the caller 
    return dtListOfPrimaryKeyTables; 
} 

Mais maintenant, je veux cette logique à appeler dans la fonction ci-dessous ... Je l'ai essayé, mais il ne se fait pas.

public class PrimaryKeyChecker : IMFDBAnalyserPlugin 
{ 
    public string RunAnalysis(string ConnectionString) 
    { 
     return "string"; 
    } 
} 

J'ai besoin d'ajuster la returntype de la fonction de type chaîne et toute la logique à traiter dans la méthode RunAnalysis

Voulez-vous les gars s'il vous plaît aidez-moi !!!

+0

Comme je lie la table du serveur et la stocke dans un datatable, puis la peupler dans une grille de données – Srivastava

+0

S'il vous plaît nous montrer ce que vous avez essayé? – TalentTuner

Répondre

0

Pour convertir un DataTable en chaîne, vous pouvez utiliser la capacité du DataTable à écrire lui-même dans Xml, puis convertir le XML en une chaîne.

0
return (from rowItem in dt.AsEnumerable() 
       select Convert.ToString(rowItem["TABLES"])).ToList(); 

Édition: renvoie les noms de vos tables en tant que collection IList.

0

Pas sûr que je comprends à 100% votre question, mais il semble que tout ce que vous devez faire est soit:

  1. Exécutez le code que vous avez, et le convertir en une chaîne
  2. Refactor la coder dans les lecteurs de données et juste le renvoyer directement, en omettant l'utilisation de DataSets/DataTables.

Pour adapter votre code PrimaryKeyChecker et retourner une chaîne de tables, vous pouvez écrire quelque chose comme ceci:

public string RunAnalysis(string localServer, string userName, string password, string selectedDatabase) 
{ 
    DataTable dt = GetAllPrimaryKeyTables(localServer, userName, password, selectedDatabase); 
    StringBuilder sb = new StringBuilder(); 
    foreach (DataRow dr in dt.Rows) 
    { 
     sb.AppendLine(dr.IsNull(0) ? "" : dr[0].ToString()); 
    } 
    return sb.ToString(); 
} 

Cependant, je recommande à tout le moins, le retour d'une liste de sorte qu'il peut être facilement recherché et filtré et utilisé pour la présentation sur l'interface utilisateur. Je m'excuse si j'ai complètement mal compris votre question.

0
using System.Linq; 
... 

public string GetAllPrimaryKeyTableNames(string localServer, string userName, string password, string selectedDatabase) { 
    DataTable table = GetAllPrimaryKeyTables(localServer, userName, password, selectedDatabase); 

    return string.Join(",", table.AsEnumerable().Select(r => r.ItemArray[0]).ToArray()); 
} 

Cela renverra une chaîne contenant vos noms de table séparés par une virgule.

EDIT

Je vois dans votre question que vous avez votre méthode nommée RunAnalysis. N'hésitez pas à changer le nom de la méthode dans ma réponse à ce que vous voulez, ainsi que les paramètres. La partie importante est l'utilisation de string.Join avec LINQ.