Вопрос

Я работаю с сеткой данных и адаптером, которые соответствуют таблице 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.Подготовить() позвони.

Мой вопрос заключается в следующем:Нужно ли мне делать это постоянно при работе с сохраненными в OleDb обработками / запросами?Почему?У меня также есть другой проект, в котором мне нужно будет сделать то же самое с SqlDbCommand...должен ли я делать это и с ними тоже?

Это было полезно?

Решение

Это называется, как ни странно, подготовленным заявлением, и на самом деле они действительно хороши.По сути, происходит то, что вы либо создаете, либо получаете инструкцию sql (insert, delete, update) и вместо передачи фактических значений вы передаете "?" в качестве заполнителя.Все это хорошо, за исключением того, что мы хотим, чтобы вместо "?" передавались наши значения.

Итак, мы готовим инструкцию таким образом, чтобы вместо "?" мы передавали параметры, как указано выше, которые будут значениями, вводимыми вместо заполнителей.

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

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

Другие советы

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

Используете ли вы поставщика JET OLEDB?или MSDASQL + JET ODBC?

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top