Приложение, над которым я сейчас работаю, использует магию текста для форматирования строки в оператор SQL INSERT
и поэтому подвержено атакам SQL-инъекций.Я хотел бы изменить это путем перехода к параметризованному формату запроса.
Например, одно определение таблицы выглядит следующим образом:
CREATE TABLE DBA.dms_link (
nr INTEGER
, hybrid NVARCHAR (256)
, docid INTEGER
, container NVARCHAR (128)
, link_category INTEGER
, dms_func_id NCHAR (20)
, CONSTRAINT ASA655 PRIMARY KEY (nr)
, CONSTRAINT dms_link_dms_categories FOREIGN KEY (link_category) REFERENCES DBA.dms_categories (id)
, CONSTRAINT dms_link_dms_doc FOREIGN KEY (docid, container) REFERENCES DBA.dms_doc (docid, container)
, CONSTRAINT fk_dms_link_dms_func FOREIGN KEY (dms_func_id) REFERENCES DBA.dms_func (id)
);
Данные для ссылок на внешний ключ предоставляются в видеподзапросы, например:
list.Add("docid", "(SELECT max(docid) FROM dms_doc)");
Я знаю, как связать параметры со значениями в экземпляре IDbCommand
.Однако я не уверен, поддерживается ли способ вставки ссылок на внешние ключи, как в описанной таблице.Не существует типа System.Data.Odbc.OdbcType
, который позволял бы передавать подзапрос.И другие варианты кажутся противоречивыми: хотя целевое поле Int
, подзапрос как тип будет String
.
Примечание. Я понимаю, что поиск идентификаторов типа SELECT MAX()
проблематичен, однакосистема, использующая базу данных, также построена таким образом.