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. P>
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? P>
7 Réponses :
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: puis tout ce que je devais faire pour nettoyer les commandes a été une recherche d'oraclecommand et de remplacer par Databasecommand et test. p> p>
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.
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; } }
Je n'ai pas essayé mais, p>
J'ai vu quelque chose comme p>
" Peut-être que cela peut aider. P> cmd.getType (). GetProperty (" BindByName "). SetValue (cmd, true, null); code>"
Dans le fichier PETAPOCO.CS. P>
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 code> dans la chaîne de connexion.
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; }
C'est la seule façon judicieuse de le faire sans avoir à refacteur et à changer de code de code.
Réduire # Lignes de code
VB.NET P>
OracleCommand command = new OracleCommand(query, connection) { CommandType = CommandType.StoredProcedure, BindByName = true };
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; // ... }
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>
Il n'y a aucun moyen de définir
oraclecommand.bindbyname code> 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.