2012-02-21 6 views
1

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

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

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

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

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

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

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

Любые идеи?

ответ

1

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

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

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

+0

Я думаю, что понимаю, что вы имеете в виду. Таким образом, в основном замена символа будет обрабатываться моим классом-оболочкой, когда я добавлю параметры в команду. Таким образом, я бы просто обнаружил диалект, необходимый мне, как сейчас, и поставлю правильный синтаксис: или:. Одна из проблем заключается в том, что одна из моих баз данных может вообще не поддерживать переменные связывания. Я предполагаю, что в этом случае мне придется выполнять замену строки в моем коде, но я должен был бы заранее знать, что он не поддерживает переменную связывания. На самом деле это довольно сложная задача. – CSharpened

+0

@CSharpened точно. Однако в этот момент я ожидал бы, что все достойные драйверы базы данных будут поддерживать переменные связывания каким-то образом, потому что это так важно для предотвращения атак SQL-инъекций. – btilly

+0

Хорошо спасибо за информацию. Я увижу, смогу ли я реализовать свое предложение успешно. Мне кажется, что мне нужно, и я думал, но я надеялся, что может быть немного более элегантное решение. Благодарю. – CSharpened

Смежные вопросы