J'essaie d'améliorer les performances de mes requêtes SQL Oracle en utilisant la liaison de tableau à un OracleParameter.ExecuteReader avec la liaison de tableau Oracle
C'est essentiellement ce que je suis en train de faire:
List<string> IDValList = new List<string>();
IDValList.Add("IDOne");
IDValList.Add("IDTwo");
List<int> sizes = new List<int>();
foreach(string id in IDValList)
{
sizes.Add(id.Length);
}
using(OracleCommand cmd = new OracleCommand("select col1, col2, col3 from table where col4 in (:idArray)", _conn))
{
cmd.CommandType = System.Data.CommandType.Text;
OracleParameter arrayParam = new OracleParameter("idArray", OracleDbType.Varchar2);
arrayParam.Direction = System.Data.ParameterDirection.Input;
arrayParam.Value = IDValList.ToArray();
arrayParam.ArrayBindSize = sizes.ToArray();
cmd.ArrayBindCount = IDValList.Count;
cmd.Parameters.Add(arrayParam);
using(OracleDataReader dr = cmd.ExecuteReader())
{
while(dr.Read())
{
// now read the row...
Cette compile et fonctionne, mais je reçois toujours seulement en arrière une ligne, pour la première ID. C'est comme son ignorant le reste des valeurs dans le tableau dans le paramètre.
Fait intéressant, le ArrayBindStatus du paramètre est réussi pour toutes les valeurs.
Qu'est-ce qui me manque? Ou cela ne fonctionnera pas avec un OracleReader?
Merci
Edit: En fait, je suis en train de suivre cet exemple, mais je veux être en mesure de lire l'ensemble de données résultant de la requête à l'aide d'un DataReader.
http://www.oracle.com/technology/oramag/oracle/09-sep/o59odpnet.html
Avez-vous trouvé une solution pour cela? – aggsol
Je ne pense pas que nous ayons jamais fait. Je rappelle que nous l'avons codé à la dure ... – MonkeyWrench
Selon cette question, http: // stackoverflow.com/questions/25401787/c-odp-net-large-in-clause-solution, voir le commentaire de Tyree Jackson "L'utilisation de ArrayBindCount par exemple est limitée par Oracle pour une utilisation dans les instructions ExecuteNonQuery (Update/Insert/Delete) " Je ne peux pas le confirmer à partir des documents Oracle, mais cela a été mon expérience aussi. – VinceJS