używam System.Data.OracleClient
który ma parametr wiążące po imieniu i sprawdzasz CommandText i parametry są zsynchronizowane:ORA-01008 ze wszystkimi zmiennymi związany
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) + ".");
}
}
Jeszcze jedno zapytanie rzuca ORA-01008: not all variables bound
. Przy ręcznym wstawianiu wartości parametrów do naruszającego tekst CommandText uruchamiane jest zapytanie, więc wartości CommandText i parametry powinny być w porządku. Używam: jako przedrostka zarówno dla zmiennych, jak i nazw parametrów i działa dla innych zapytań.
Jak ustalić przyczynę tego wyjątku?
czy masz kod składający zapytania? Czy próbowałeś też z klientami .net (lub innymi sprzedawcami)? Myślę, że Microsoft nie dostarcza już klientowi Oracle. –
Niejasno pamiętam problem z jednym z klientów Oracle, że parametry musiały być powiązane dokładnie w tej samej kolejności, w jakiej pojawiły się w zapytaniu lub nie działały - czy to może być problem tutaj? – Rup
@Nick - Polecenie było aktualizacją z ~ 40 parametrami, więc dla czytelności i ip-powodów upuściłem je. Próbowałem z ODT.NET z Oracle, ale miał problem z wdrożeniem go. (Zobacz także komentarz poniżej). – Grastveit