Разобрать через параматеризованную строку для oledb - PullRequest
3 голосов
/ 01 августа 2011

Я использую OleDB в C # /. Net и мне не нравится, как oledb делает параметры с вопросительными знаками:

using (OleDbConnection sqlConnect = drtevs.GetConnection())
{

OleDbCommand command.CommandText = "UPDATE NAME SET FIRST_NAME = ?, LAST_NAME = ? WHERE ID = ?;";
command.Parameters.Add(new OleDbParameter("@FIRST_NAME", txtFirst));
command.Parameters.Add(new OleDbParameter("@LAST_NAME", txtLast));
command.Parameters.Add(new OleDbParameter("@ID", 12));
command.ExecuteNonQuery();

}

Проблема, которую я вижу, заключается в том, что они не названы и поэтому не могут их повторно использовать. Есть ли лучший способ сделать параметры с OleDB? Если кто-то может дать мне код для выполнения кода, например LINQ-TO-SQL , следующим образом:

db.ExecuteQuery("UPDATE NAME SET FIRST_NAME = {0}, LAST_NAME = {1} WHERE ID = {2}", txtFirst, txtLast, 12);

Я знаю, что собственный поставщик SQL .net имеет именованные параметры (например, @FIRST_NAME, @LAST_NAME), но поскольку я работаю как с SQL Server, так и с Oracle, это не вариант.

EDIT: Я хочу избежать SQL-инъекций и очистить мои параметры, а также иметь возможность вставлять несериализуемые объекты, такие как байтовые массивы.

Все ответы, данные до сих пор потерпели бы неудачу, если бы моя фамилия была "DROP TABLE NAME -", кроме того, это вызвало бы повреждение моей базы данных

Ответы [ 2 ]

3 голосов
/ 01 августа 2011

Если вы хотите повторно использовать значение и хотите вменяемые запросы, возможно, моральный эквивалент:

declare @id int = ?
declare @when datetime = ?
...
// some complex query involving @id and @when

Здесь ? ограничен вершиной, и контекст понятен.

1 голос
/ 02 августа 2011

В основном мы можем имитировать поведение linq-to-sql. Из документации по функции :

Параметры выражаются в тексте запроса с использованием тех же фигурных обозначений, которые используются Console.WriteLine () и String.Format (). Фактически, String.Format () фактически вызывается в строке запроса, которую вы предоставляете, заменяя параметры в фигурных скобках сгенерированными именами параметров, такими как @ p0, @ p1…, @p (n).

Таким образом, должна быть возможность получить похожий код с одним предупреждением: поскольку OleDb не поддерживает именованные параметры, поведение для множественных или неупорядоченных применений заполнителей не определено. Но мы можем по крайней мере получить следующее:

public void ExecuteQuery(string sql, params object[] parameters)
{
    //format the sql string with safe parameter names
    var paramNames = new string[parameters.Length];
    for (int i = 0; i<parameters.Length; i++)
    {
        paramNames[i] = "?";
    }
    sql = string.Format(sql, paramNames);

    using (OleDbConnection sqlConnect = drtevs.GetConnection())
    {   
        OleDbCommand command.CommandText = sql;

        foreach (int i = 0; i< parameters.Length; i++)
        {
            command.Parameters.Add(new OleDbParameter("?", parameters[i]));
        }

        command.ExecuteNonQuery();

    }
}

Обратите внимание, что это не будет работать для запроса, который использует один и тот же заполнитель дважды, но это потому, что OleDb не поддерживает именованные параметры, как linq-to-sql.

...