Привязать параметры переменных

Можно ли обозначить переменную связывания в SQL Server, используя ту же нотацию, что и Oracle, то есть: 0, : 1 вместо использования ?.

Я искал, но не нашел ничего убедительного по этому поводу. На данный момент мое решение использует переменные связывания для ввода значений в операторы, которые я запускаю в базе данных, которая отлично работает в Oracle, но мне также нужно сделать то же самое в SQL Server и PostGIS, чтобы назвать несколько. Я не хочу говорить, например:

switch(dialect)
{
    case "Oracle":
    {
        oleDataBaseConnection.AddParameter(":1", coordsys);
        break;
    }

    case "SQLServer":
    { 
        oleDataBaseConnection.AddParameter("?", coordsys);
        break;
    }
}

*AddParameter() — это функция из моего класса-оболочки, которая добавляет значения в список для добавления к объекту команды при вызове написанной мной функции выполнения.

Я хотел бы, чтобы мой код был как можно более чистым и не содержал жестко закодированного материала, как показано выше. Я хочу решение, которое подходит всем. (да, я знаю, что это, вероятно, принятие желаемого за действительное!)

Я знаю, что мог бы использовать замену строки, чтобы сделать это, но это просто не то, что мне нужно. Я действительно не хочу использовать такой обходной путь. Также мой руководитель проекта попросил меня попытаться найти решение с использованием переменных связывания.

Любые идеи?


person CSharpened    schedule 21.02.2012    source источник


Ответы (1)


Короткий ответ: нет, переменные связывания реализуются по-разному в разных базах данных. Так что где-то вам понадобится запутанная логика совместимости.

Тем не менее, я лично решал эту проблему в прошлом, используя подстановку строк, чтобы ввести правильный синтаксис для параметра привязки. Таким образом, вы можете вставить :coordsys в свой оператор SQL, а затем oleDataBaseConnection.AddParameter("coordsys", coordsys); в свой код. Затем ваш оператор подготовки будет искать SQL, находить :coordsys и заменять его тем, что вам нужно (например, ?), а также создавать список параметров по именам для последующего выполнения. Когда вы переходите к выполнению, вы можете на лету создать правильный список параметров привязки для использования.

Реализация за кулисами немного сложна, но я лично обнаружил, что это приводит к чистому SQL с преимуществами параметров привязки (например, производительность базы данных, безопасность от атак путем внедрения SQL).

person btilly    schedule 21.02.2012
comment
Думаю, я понимаю, что вы имеете в виду. Таким образом, в основном замена символов будет обрабатываться моим классом-оболочкой, когда я добавляю параметры в команду. Так что я бы просто определил необходимый диалект, как я это делаю сейчас, и вставил правильный синтаксис, будь то ? или :. Одна из проблем заключается в том, что одна из моих баз данных может вообще не поддерживать переменные связывания. Я предполагаю, что в этом случае мне пришлось бы заменить строку в моем коде, но я должен был бы заранее знать, что он не поддерживает переменную связывания. Это действительно довольно сложная задача. - person CSharpened; 21.02.2012
comment
@CSharpened точно. Однако на данный момент я ожидаю, что все достойные драйверы баз данных будут каким-то образом поддерживать переменные связывания, потому что это очень важно для предотвращения атак SQL-инъекций. - person btilly; 21.02.2012
comment
Хорошо, спасибо за информацию. Я посмотрю, смогу ли я успешно реализовать ваше предложение. Это похоже на то, что мне нужно и о чем я думал, но я надеялся, что может быть немного более элегантное решение. Спасибо. - person CSharpened; 21.02.2012