2010-04-22 25 views
1

Nous avons reçu une "procédure stockée" de la part de nos employés RPG qui renvoie six tables de données. En essayant de l'appeler à partir de .NET (C#, 3.5) en utilisant le fournisseur iSeries pour .NET (essayé en utilisant à la fois V5R4 et V6R1), nous voyons des résultats différents basés sur la façon dont nous appelons le proc stocké. Voici manière que nous préférons le faire:Comportement très étrange du fournisseur iSeries

using (var dbConnection = new iDB2Connection("connectionString")) 
{ 
    dbConnection.Open(); 
    using(var cmd = dbConnection.CreateCommand()) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "StoredProcName"; 
     cmd.Parameters.Add(new iDB2Parameter("InParm1", 
      iDB2DbType.Varchar).Value = thing; 
     var ds = new DataSet(); 
     var da = new iDB2DataAdapter(cmd); 
     da.Fill(ds); 
    } 
} 

En procédant ainsi, nous obtenons CINQ tables de retour dans le jeu de résultats. Cependant, si nous faisons cela:

cmd.CommandType = CommandType.Text; 
cmd.CommandText = "CALL StoredProcName('" + thing + "')"; 

Nous rapportiez les attendus SIX tables.

Je me rends compte qu'il n'y a pas beaucoup d'entre nous sorry folks .NET-à-DB2 ici, mais je suis en espérant que quelqu'un a vu cela auparavant.

TIA.

Répondre

1

Regardez dans la propriété LibraryList (et peut-être la dénomination) de votre chaîne de connexion. Lorsque vous utilisez CommandType.StoredProcedure, il est possible qu'il exécute la procédure stockée directement à partir de la bibliothèque de base de données SQL. Lorsque vous utilisez CommandType.Text il recherche dans la liste de bibliothèque pour trouver la procédure stockée. Vous finissez par exécuter différentes versions de la procédure stockée à partir de différentes bibliothèques, ce qui vous donne des résultats différents.

+0

Merci! Nous ne faisons pas l'expérience de cela, mais c'est certainement quelque chose à surveiller et agréable d'être au courant. – David