J'utilise System.Data.OracleClient
qui lie les paramètres par leur nom et vérifie que CommandText et Parameters sont synchronisés :
public string CommandText { get; set; }
public IEnumerable<OracleParameter> Parameters { get; set; }
private void VerifyThatAllParametersAreBound()
{
var variableNames = Regex.Matches(CommandText, ":\\w+")
.Cast<Match>().Select(m => m.Value).ToArray();
var parameteterNames = Parameters.Select(p => p.ParameterName).ToArray();
var unboundVariables = variableNames.Except(parameteterNames).ToArray();
if (unboundVariables.Length > 0)
{
throw new Exception("Variable in CommandText missing parameter: "
+ string.Join(", ", unboundVariables) + ".");
}
var unboundParameters = parameteterNames.Except(variableNames).ToArray();
if (unboundParameters.Length > 0)
{
throw new Exception("Parameter that is not used in CommandText: "
+ string.Join(", ", unboundParameters) + ".");
}
}
Une question se pose encore ORA-01008: not all variables bound
. Lorsque l'on insère manuellement les valeurs des paramètres dans le texte de commande incriminé, la requête s'exécute, ce qui signifie que le texte de commande et les valeurs des paramètres doivent être corrects. J'utilise : comme préfixe pour les variables et les noms de paramètres et cela fonctionne pour les autres requêtes.
Comment puis-je déterminer la cause de cette exception ?