парсинг oracle запрос параметров c# - PullRequest
2 голосов
/ 01 февраля 2020

Я хотел бы сделать то же самое, что и oracle sqldeveloper, сделать с параметризованными запросами (но из c#, а не java). Допустим, существует произвольный пользовательский запрос, например

select * from dual where 1 = :parameter

Моя задача - безопасно проанализировать похожие строки, определить параметры, запросить их у пользователя и выполнить запрос. Какой подход правильный / безопасный? Я предполагаю, что для этого есть какой-то oracle клиентский API. Или правильно использовать какой-нибудь материал pl / sql (например, из DBMS_ SQL)? Я еще не мог найти такую ​​вещь ...


Обновление / уточнение: см. Пример кода ниже:

// user enters the query string with parameters somehow:
string sql = AskUserForSelectString();
// now the value of sql is:
// "select column0 from tablename where column1 = :param1 and column2 = :param2 ;"

// this is my original question: HOW TO DO THIS?
List<string> param_names = OracleParseQueryAndGiveMyParameters(sql);
// param_names is now a list of ":param1",":param2"

// ask user again for parameter values:
var param_values = new List<string>();
foreach (var param_name in param_names) 
{
    string param_value = AskUserForParameterValue(param_name);
    param_values.Add(param_value);
}

// give the parameter values for the query in safe way:
using (var cmd = new SqlCommand(sql, myDbConnection))
{
    for (int i=0; i< param_names.Count; i++)
        cmd.Parameters.AddWithValue(param_names[i], param_values[i]);
    var result = cmd.ExecuteReader();
    // process result...
}

Ключевым моментом является то, что я не знаю параметры заранее. Это именно то, что может сделать SqlDeveloper. (Это не проблема, если EF ожидает @ перед именем параметра вместо двоеточия, это можно легко решить.)

Ответы [ 2 ]

2 голосов
/ 01 февраля 2020

Вы можете сделать это следующим образом:

var sql = "INSERT INTO myTable (myField1, myField2) " +
          "VALUES (@someValue, @someOtherValue);";

using (var cmd = new SqlCommand(sql, myDbConnection))
{
    cmd.Parameters.AddWithValue("@someValue", someVariable);
    cmd.Parameters.AddWithValue("@someOtherValue", someTextBox.Text);
    cmd.ExecuteNonQuery();
}

То, что вы абсолютно НЕ должны делать, это:

var sql = "INSERT INTO myTable (myField1, myField2) " +
          "VALUES ('" + someVariable + "', '" + someTextBox.Text + "');";

var cmd = new SqlCommand(sql, myDbConnection);
cmd.ExecuteNonQuery();

Проблема со вторым примером заключается в том, что он открывает ваш код для SQL Атака инъекцией.

1 голос
/ 02 февраля 2020

Один (хакерский, но точный ?!) способ с исходным синтаксисом переменной привязки ": parameter" - вызвать C и использовать функции Oracle OCI, чтобы выполнить анализ за вас. Подготовьте оператор с помощью OCIStmtPrepare2(), а затем вызовите OCIStmtGetBindInfo(), чтобы получить имена переменных.

...