11
votes

DBCommand et SQL paramétré, Oracle vs SQL Server

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 ": paramètreername" tandis que pour SQL Server, j'ai besoin d'utiliser "@ paramètreername" . Y a-t-il un moyen de faire ce générique?

code d'échantillon: xxx


0 commentaires

3 Réponses :


2
votes

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}"; }}


0 commentaires

6
votes

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> xxx pré>

i Création d'une variable de membre du type de partablicateur: p> xxx pré>

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);
...


0 commentaires

0
votes

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,"@",":");
}


1 commentaires