Зачем мне нужен OleDbCommand.Prepare ()? - PullRequest
1 голос
/ 01 октября 2008

Я работаю с сеткой данных и адаптером, которые соответствуют таблице MSAccess через сохраненный запрос (с именем «UpdatePaid», 3 параметра, как показано ниже), например так:

    OleDbCommand odc = new OleDbCommand("UpdatePaid", connection);

    OleDbParameter param;

    odc.CommandType = CommandType.StoredProcedure;

    param = odc.Parameters.Add("v_iid", OleDbType.Double);
    param.SourceColumn = "I";
    param.SourceVersion = DataRowVersion.Original;

    param = odc.Parameters.Add("v_pd", OleDbType.Boolean);
    param.SourceColumn = "Paid";
    param.SourceVersion = DataRowVersion.Current;

    param = odc.Parameters.Add("v_Projected", OleDbType.Currency);
    param.SourceColumn = "ProjectedCost";
    param.SourceVersion = DataRowVersion.Current;

    odc.Prepare();

    myAdapter.UpdateCommand = odc;

    ...

    myAdapter.Update();

Работает нормально ... но по-настоящему странно то, что не , пока я не вставлю odc.Prepare () . Мой вопрос, таким образом: мне нужно делать это все время при работе с сохраненными в Prole / запросах OleDb? Зачем? У меня также есть еще один проект, в котором я должен сделать то же самое с SqlDbCommand ... я должен сделать это тоже с этим?

Ответы [ 3 ]

3 голосов
/ 01 октября 2008

Это называется, как ни странно, подготовленным утверждением, и на самом деле они действительно хороши. В основном, что происходит, если вы создаете или получаете SQL-оператор (вставка, удаление, обновление) и вместо передачи фактических значений вы передаете «?» в качестве заполнителя. Это все хорошо, за исключением того, что мы хотим, чтобы наши значения передавались вместо «?».

Итак, мы подготавливаем утверждение, чтобы вместо «?» Мы передавали параметры, как вы указали выше, которые будут значениями, которые вводятся вместо заполнителей.

Подготовка разбирает строку, чтобы найти, где параметры могут заменить знаки вопроса, поэтому все, что вам нужно сделать, это ввести данные параметров и выполнить команду.

В пределах oleDB сохраненные запросы являются подготовленными операторами, поэтому требуется подготовка. Я не использовал хранимые запросы с SqlDB, поэтому мне придется отложить до 2 предыдущих ответов.

0 голосов
/ 01 октября 2008

Вы используете JET OLEDB Provider? или MSDASQL + JET ODBC?

Вам не нужно звонить Prepare(), но я считаю, что это зависит от водителя / провайдера.

Вам определенно не нужно использовать Prepare() для System.Data.SqlClient.

0 голосов
/ 01 октября 2008

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

...