8
votes

Y a-t-il un moyen de forcer oraclecommand.bindbyname d'être vrai par défaut pour ODP.net?

Depuis le système.data.oracleclient bibliothèque a été déprécée , nous sont en train de migrer notre base de code pour utiliser fournisseur de données Oracle pour .NET. (ODP.NET) à la place. L'une des questions que nous avons rencontrées est que le système.data.oracleclient utilise la liaison de nom de paramètre par opposition à la liaison par position et tout le code accédant directement à system.data.oracleclient.oraclecommand par opposition à l'utilisation d'une couche de données intermédiaire.

Comme il y a beaucoup de code, il y a un moyen facile de forcer l'ODP.net oraclecommand.bindbyName d'être true par défaut ou devons-nous suivre et définir la valeur à chaque fois qu'elle est utilisée? À défaut, existe-t-il un moyen facile d'insérer cette ligne de code dans Visual Studio 2008?


5 commentaires

Il n'y a aucun moyen de définir oraclecommand.bindbyname sur true par défaut.


@Vadim K. - C'est une sorte de ce que j'avais peur, on dirait que nous avons besoin d'un moyen de trouver tous les points dans le code qui en ont besoin alors.


Les commandes stockées sont-elles des appels de procédure ou des requêtes de texte? Je demande seulement parce que s'ils sont stockés des appels de procédure, BindbyName ne fonctionnera de toute façon pas - vous devrez utiliser un ordre de paramètre correct.


@Chals m - Ce sont toutes des questions de texte.


Pour une défaillance d'oracle encore plus curieuse, attendez que vous essayiez de lire une longue! Vous suggère de toujours définir initialeLongfetchSize = -1 aussi.


7 Réponses :


10
votes

Je sais que ce fil est vieux, mais j'ai eu le même problème aujourd'hui et je pensais que je partagerais ma solution au cas où quelqu'un d'autre avait ce problème. Étant donné que Oraclecommand est scellé (qui aspire), j'ai créé une nouvelle classe qui encapsule l'oraclecommand, définissant le nom de bindbyName à true sur l'instanciation. Voici une partie de la mise en œuvre: xxx

puis tout ce que je devais faire pour nettoyer les commandes a été une recherche d'oraclecommand et de remplacer par Databasecommand et test.


3 commentaires

Ce n'est pas la réponse que j'espérais retour quand j'ai écrit la question, mais c'est le meilleur dans cette autre que de définir la valeur vous-même à chaque fois, c'est la seule option que vous avez.


DatabasEcommand devrait mettre en œuvre Idisposable, car oraclecommand est dérivé de DBCommand qui implémente ceci.


Y a-t-il encore une meilleure solution que cela? Chaque réponse Oracle semble impliquer de créer une sorte de shim pour compenser les carences des clients Oracle.



0
votes

Ajouter une classe partielle pour votre table à table et ajouter une méthode, ou une propriété, comme vous le souhaitez, avec ce code:

        for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1))
        {
            if ((this.CommandCollection[i] != null))
            {
                ((global::Oracle.DataAccess.Client.OracleCommand)(this.CommandCollection[i])).BindByName = value;
            }
        }


0 commentaires

13
votes

Je n'ai pas essayé mais,

J'ai vu quelque chose comme

" cmd.getType (). GetProperty (" BindByName "). SetValue (cmd, true, null); " Dans le fichier PETAPOCO.CS.

Peut-être que cela peut aider.


2 commentaires

Cela permet également de travailler avec des commandes sans avoir à avoir une dépendance sur les objets de données spécifiques à Oracle.


Testé et fonctionne. Merci. C'est une honte sale douce que l'on doit recourir à la magie noire de la réflexion afin d'obtenir un comportement qui aurait dû être là par défaut. Je souhaite qu'ils exposeraient le paramètre bindbyName dans la chaîne de connexion.



5
votes

J'ai eu le même problème avec les commandes de mise à jour SQLDaTasource après avoir porté le code ASPX à oracle.dataacees.Client et résolu en changeant la propriété oraclecommand.bindbyName dans Sqldatasource ONUPDATURE TRANSTLULER comme suit:

protected void SqlDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    Oracle.DataAccess.Client.OracleCommand b_OracleCommand = 
                  (Oracle.DataAccess.Client.OracleCommand)e.Command;
    b_OracleCommand.BindByName = true;
}


1 commentaires

C'est la seule façon judicieuse de le faire sans avoir à refacteur et à changer de code de code.



-2
votes

Réduire # Lignes de code

VB.NET P>

OracleCommand command = new OracleCommand(query, connection) { CommandType = CommandType.StoredProcedure, BindByName = true };


0 commentaires

1
votes

J'ai résolu ce problème Réglage de la propriété BindbyName dans le gestionnaire de l'événement de mise à jour SQLDaTasource:

protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
    ((Oracle.ManagedDataAccess.Client.OracleCommand)e.Command).BindByName = true;
    // ...
}


0 commentaires

2
votes

avec oracle.ManagedDataAccess.Client, vous pouvez configurer dans APP.Config:

<oracle.manageddataaccess.client>
<version number="*">
  <dataSources>
    <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
  </dataSources>
  <settings>
    <setting name="BindByName" value="True"/>
  </settings>
</version></oracle.manageddataaccess.client>


0 commentaires