J'ai une application qui, entre autres, stockera diverses données dans une base de données. La base de données peut être ORACLE ou SQL Server. Le SQL est créé de manière dynamique sur la base de la configuration et des valeurs captées lors de l'exécution.
En utilisant dbProviderFactory Mes méthodes de DB sont capables de travailler avec Oracle ou SQL Server sans écrire de code personnalisé pour aucune des bases de données, sauf d'une chose; Paramètres / variables de liaison. Pour Oracle, j'ai besoin d'utiliser code d'échantillon: p> ": paramètreername" code> tandis que pour SQL Server, j'ai besoin d'utiliser "@ paramètreername" code>. Y a-t-il un moyen de faire ce générique? P>
3 Réponses :
Créez une propriété abstraite pour obtenir la chaîne de format utilisée dans la boucle "Valeurs".
class DBOperations
public abstract string ParameterStringFormat;
...
for (int i = 0; i < values.Length; i++)
{
sql.Append(String.Format(ParamterStringFormat, columns[i].ColumnName)); // SQL Server
}
class SqlDbOperations : DBOperations
public override string ParameterStringFormat { get { return "@{0}"; }}
class OracleDBOperations : DBOperations
public override string ParameterStringFormat { get { return ":{0}"; }}
J'ai accepté une réponse pour cette question il y a longtemps, mais pour une raison quelconque de cette réponse n'est plus ici ... Donc, je suppose que je dois répondre à ma propre question.
Ce que j'ai fait était de créer un cours de parambœil: p> i Création d'une variable de membre du type de partablicateur: p> puis dans la méthode où j'utilise des paramètres, je Utilisez-le comme suit: P> ...
string paramMarker;
DbParameter param = m_ParamBuilder.CreateParameter(destination[i].ColumnName,
out paramMarker);
sql.Append(paramMarker);
param.Direction = ParameterDirection.Input;
param.Value = source[i];
Cmd.Parameters.Add(param);
...
Il suffit de lancer une autre option si vous le souhaitez rapidement et sale.
string sql = select * from foo there foo.id = @id;
if (isOracle) {
sql = replaceAll(sql,"@",":");
}
Solution avec regex: Stackoverflow.com/Questtions/35063018/...