Pregunta

Estoy trabajando con un datagrid y un adaptador que se corresponden con una tabla MSAccess a través de una consulta almacenada (llamada " UpdatePaid " ;, 3 parámetros como se muestra a continuación) así:

    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();

Funciona bien ... pero lo realmente extraño es que no hasta que puse la llamada odc.Prepare () .
< br> Mi pregunta es así: ¿Debo hacer eso todo el tiempo cuando trabajo con las consultas / procesos almacenados en OleDb? ¿Por qué? También tengo otro proyecto en el que tendré que hacer lo mismo con un SqlDbCommand ... ¿Tengo que hacerlo con esos también?

¿Fue útil?

Solución

Esto se llama, extrañamente, una declaración preparada, y en realidad son muy agradables. Básicamente, lo que sucede es que creas u obtienes una instrucción SQL (insertar, eliminar, actualizar) y en lugar de pasar valores reales, pasas "? & Quot; como un poseedor de lugar. Todo esto está muy bien, excepto que lo que queremos es que nuestros valores se transfieran en lugar de "? & Quot;

Así que preparamos la declaración, así que en lugar de "? " ;, pasamos los parámetros que tiene arriba, que serán los valores que irán en lugar de los marcadores de posición.

La preparación analiza la cadena para encontrar dónde los parámetros pueden reemplazar los signos de interrogación, por lo que todo lo que tiene que hacer es ingresar los datos de los parámetros y ejecutar el comando.

Dentro de oleDB, las consultas almacenadas son declaraciones preparadas, por lo que se requiere una preparación. No he usado consultas almacenadas con SqlDB, por lo que tendría que remitir a las 2 respuestas anteriores.

Otros consejos

No lo uso con SqlDbCommand. Me parece un error que sea necesario . Solo debería ser agradable tener si va a llamar a un procedimiento varias veces seguidas. Tal vez me equivoque y hay una nota en la documentación sobre los proveedores que aman esta llamada demasiado.

¿Está utilizando el proveedor JET OLEDB? o MSDASQL + JET ODBC?

No debería tener que llamar a Prepare () , pero creo que eso depende del conductor / proveedor.

Definitivamente no necesita usar Prepare () para System.Data.SqlClient .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top