2009-10-15 5 views
4

J'ai un ensemble de procédures stockées que j'utilise pour remplir une CheckBoxList ASP.Net. Lors de l'exécution de cette procédure à partir du code en tant que {CALL ProcedureName (params); } avec le type défini en tant que procédure stockée, il semble que seul un résultat partiel est renvoyé (ie plusieurs colonnes du résultat réel sont manquantes.)Le résultat de la procédure stockée MySQL ODBC est manquant. Colonnes

Si je copie le CommandText de la requête (après avoir utilisé un point d'arrêt pour obtenir le texte exact envoyé) et l'exécuter directement dans Navicat (ou toute autre interface graphique MySQL), je reçois toutes les colonnes attendues.

Voici le code qui ne fonctionne pas:

using (OdbcCommand command = OdbcConnection.CreateCommand()) 
{ 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "{ " + string.Format(StoredProcedureCall, foundationId, fpids, "", "", "NULL", "2001/01/02", "2001/01/01", "*") + 
          " }"; 
    using (OdbcDataReader reader = command.ExecuteReader()) 
    { 

     for (int i = 0; i < reader.FieldCount; i++) 
     { 
      columns.Add(reader.GetName(i)); 
     } 
    } 
} 

Si je change le code à la suivante mais il commence à travailler (uniquement en ajoutant l'autre à l'aide):

using (OdbcConnection) 
using (OdbcCommand command = OdbcConnection.CreateCommand()) 
{ 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "{ " + string.Format(StoredProcedureCall, foundationId, fpids, "", "", "NULL", "2001/01/02", "2001/01/01", "*") + 
          " }"; 
    using (OdbcDataReader reader = command.ExecuteReader()) 
    { 

     for (int i = 0; i < reader.FieldCount; i++) 
     { 
      columns.Add(reader.GetName(i)); 
     } 
    } 
} 

Qu'est-ce passe ici?

Pour référence est ici la propriété OdbcConnection:

public static OdbcConnection OdbcConnection 
{ 
    get 
    { 
     // If we have no connection or our connection isn't open 
     if (null == odbcConnection || ConnectionState.Open != odbcConnection.State) 
     { 
      odbcConnection = new OdbcConnection(BaseAccess.DBConnectionString); 
      odbcConnection.Open(); 
     } 

     return odbcConnection; 
    } 
} 
+0

Si votre application utilise les mêmes informations de connexion que Navicat? –

+0

Oui, ils s'exécutent avec le même utilisateur/mot de passe – mikeschuld

+0

Comment avez-vous découvert qu'il manque des colonnes? qu'est-ce que vous utilisez pour stocker les données envoyées par le SP? – manji

Répondre

0

Ce fut en quelque sorte lié à des connexions étant réutilisées et certaines des variables @ dans les procédures stockées ne pas être remis à zéro entre les pistes. Passer à des connexions groupées qui sont fermées/éliminées correctement est ce qui a résolu mon problème.

0

assurez-vous que vos colonnes ont tous des noms uniques.

+0

Les colonnes nommées de manière non unique lanceraient une exception MySQL. Il n'y a pas une telle exception. Sans oublier que la procédure force les noms de colonne uniques dans le code car ils sont tous numérotés (q1: blah, q2: blah, etc.) – mikeschuld

2

Cela peut être un bogue dans le pilote Odbc MySql. Essayez d'utiliser le ADO.NET driver. Aussi, je vous conseille de ne pas manipuler les connexions manuellement dans les propriétés statiques. Laissez cette tâche à ADO.NET qui traiter efficacement un pool de connexion:

using (var conn = new MySqlConnection(DBConnectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "sp_name"; 

    cmd.Parameters.Add(new SqlParameter("@foundationId", foundationId)); 
    cmd.Parameters.Add(new SqlParameter("@fpids", fpids)); 
    ... 

    using (var reader = cmd.ExecuteReader()) 
    { 
     for (int i = 0; i < reader.FieldCount; i++) 
     { 
      columns.Add(reader.GetName(i)); 
     } 
    } 
} 
+0

Le pilote ADO.Net aggrave le problème. Il ne retourne pas toutes les colonnes avec OR sans l'instruction using supplémentaire. – mikeschuld

Questions connexes