2012-10-30 4 views
1

Utilisation de MS Visual Studio 2012 Express, Utilisation de C# .NET 4.0.C# raccourcir la fonction datatable

Salut les gars, Je crois que c'est simple.

J'ai lancé un programme à la demande de mon patron, mais maintenant il me semble que j'ai beaucoup plus de temps libre.

Je vais par le code en essayant de le rendre plus compact, plus propre, etc.

Je cette une fonction .....

public void RunMonth() 
{ 
    //** top 10 listings*********************//    
    SetTxtBox1(DateTime.Now.ToString() + " ==== END OF MONTH REPORTS starting.........\r\n"); 
    SetTxtBox1(" **************************************************************************************\r\n"); 
    try 
    { 
     VRMtableDESC = querys.TopVRM("DESC"); 
     SetTxtBox1(DateTime.Now.ToString() + " ==== VRM Top has been loaded\r\n"); 
    } 
    catch 
    { 
     SetTxtBox1(DateTime.Now.ToString() + " ==== VRM Top has FAILED\r\n"); 
    } 
} 

"VRMtableDESC" est un datatable, l'un des 18 datatables environ. Pour chaque datatable, cette instruction try est exécutée.

Maintenant que vous pouvez dire cela est actuellement répété 18 fois pour chaque table. à la place je voudrais faire une boucle dans les tables à la place et les remplir avec des données.

est-il un moyen de faire cela? J'aurais besoin d'une sorte de collection pour les datatables et les appels query.function aussi loin que je sache. Jusqu'à présent, j'ai frappé un vide donc j'espère que quelque chose est manquant.

Merci à l'avance

:::: MISE À JOUR :::: Ok donc je l'ai mis en place ce à ce jour ....

foreach (DataTable tbl in MyDataSet.Tables) 
{ 
    tbl.TableName.Equals(querys.TopVRM("")); 
} 

la méthode equals doit être dynamique dans sa sélection de méthode aussi .... des idées?

:: Mise à jour (31/10/12) ::

Salut à nouveau, Im obtenir une erreur, l'erreur commune "objet n'a pas été envoyé à l'instance d'objet"

il apears sur la fusion dans la boucle foreach.

J'ai débogué mon appel de requête et semble bien.

var tables = new SortedDictionary<string, Func<DataTable>>() 
     { 
      {"VRMtableDESC", () => querys.TopVRM("DESC")}, 
      {"VRMtableASC", () => querys.BotVRM("ASC")}, 
      {"SpectableDESC",() => querys.TopSpec("DESC")}, 
      {"SpectableASC", () => querys.botSpec("ASC")}, 
      {"ParttableDESC",() => querys.TopPart("DESC")}, 
      {"ParttableASC",() => querys.BotPart("ASC")}, 
      {"MantableDESC", () => querys.TopManual("DESC")}, 
      {"MantableASC", () => querys.BotMan("ASC")}, //why is this first to run????? 
      {"UsersLockedTbl",() => querys.UserLocked()}, 
      {"NewUsersTbl", () => querys.NewUsers()}, 

      {"VRMtotaltblTOP", () => querys.VRMtotalTOP("")}, 
      {"PARTtotaltblTOP", () => querys.PARTtotalTOP("")}, 
      {"SPECtotaltblTOP", () => querys.SPECtotalTOP("")}, 
      {"MANtotaltblTOP", () => querys.MANtotalTOP("")}, 
      {"VRMtotaltblBOT", () => querys.VRMtotalBOT("")}, 
      {"PARTtotaltblBOT", () => querys.PARTtotalBOT("")}, 
      {"SPECtotaltblBOT", () => querys.SPECtotalBOT("")}, 
      {"MANtotaltblBOT", () => querys.MANtotalBOT("")}, 
     }; 

     foreach(var kvp in tables) 
     { 
      try 
      { 
       MyDataSet.Tables[kvp.Key].Merge(kvp.Value());//error occurs here 
       SetTxtBox1(String.Format("{0} ==== {1} has been Loaded\r\n", DateTime.Now.ToString(), kvp.Key)); 
      }catch(Exception e) 
      { 
       SetTxtBox1(String.Format("{0} ==== {1} has FAILED\r\n", DateTime.Now.ToString(), kvp.Key)); 
       MessageBox.Show("error:::" + e); 
      } 
     } 
     AutoRunApp(); 

toute aide serait géniale.

MISE À JOUR ::

Heres mon appel de requête de la "bunchofquerys" class

public DataTable BotMan(string order) 
    { 

      SqlConnection conn = new SqlConnection(myConnString32); 
      SqlCommand vrm = new SqlCommand(); 
      //BindingSource bindme = new BindingSource(); 
      SqlDataAdapter adapt1 = new SqlDataAdapter(vrm); 
      // DataSet dataSet1 = new DataSet(); 
      DataTable table1 = new DataTable(); 
      try 
      { 
      vrm.Connection = conn; 
      vrm.CommandType = CommandType.StoredProcedure; 
      if (order.Equals("DESC")) 
      { 
       vrm.CommandText = "dbo.TopManual"; 
      } 
      vrm.CommandText = "dbo.BotManual"; 
      vrm.CommandTimeout = 360; 

      vrm.Parameters.AddWithValue("@OrderBy", order); 
      adapt1.Fill(table1); 
      return table1; 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("eeror::zomg::: " + e); 

     } 
     return table1; 
    } 
+0

La collection naturelle pour un DataTable est le DataSet. http://msdn.microsoft.com/en-us/library/aeskbwf7.aspx –

+0

En effet, j'ai un ensemble de données et j'ai ajouter les tables vierges. Mais je ne sais pas comment ajouter les requêtes à chaque table à l'intérieur de l'ensemble de données. – lemunk

+0

actuellement j'ai un foreach (tbl datatable dans myDataSet.tables) mais c'est le contexte de code que je dois itterate par ce que je ne suis pas sûr sur, syntaxe etc – lemunk

Répondre

2

Vous avez dit que vous avez déjà un DataSet. Un moyen facile de remplir toutes les tables est d'utiliser Merge.

Dans cet exemple, je crée une correspondance entre les noms de table (le nom de la table dans le DataSet), et la fonction de requête correspondante (en supposant qu'ils renvoient un DataTable avec un schéma similaire, et votre DataSet est nommé ds).

Le Key est utilisé pour interroger le DataTable approprié dans la DataSet, et ensuite le procédé Merge est utilisé pour « remplir » la DataTable.

var tables = new SortedDictionary<string, Func<DataTable>>() //or use List of Tuples... 
{ 
    {"VRM_TOP", () => querys.TopVRM("DESC")}, 
    {"FooBar_TOP",() => querys.FooBar("DESC")}, 
    {"Something", () => querys.Something("ASC")}, 
}; 

foreach(var kvp in tables) 
    ds.Tables[kvp.Key].Merge(kvp.Value()); 

Vous pouvez le faire dans l'autre sens et itérer sur chaque table en vous DataSet et obtenir la fonction de chargement appropriée via TableName de la table.

Votre bloc try/catch peut maintenant être facilement ajouté à la boucle foreach.

foreach(var kvp in tables) 
{ 
    try 
    { 
     ds.Tables[kvp.Key].Merge(kvp.Value()); 
     SetTxtBox1(String.Format("{0} ==== {1} has ben loaded\r\n", DateTime.Now, kvp.Key)); 
    } 
    ... 
} 
+0

ive utilisé votre solution, une erreur se produit qui dit un entery avec le même clé existe déjà, des idées? – lemunk

+0

Vous avez probablement ajouté deux fois une clé au dictionnaire. – sloth

+0

Salut, yeh c'était. J'ai cependant un nouveau problème, je vais mettre à jour ma question pour montrer ce qui se passe. – lemunk