Por que eu preciso OleDbCommand.Prepare ()?
-
03-07-2019 - |
Pergunta
Eu estou trabalhando com um datagrid e adaptador que correspondem com uma tabela MSAccess através de uma consulta armazenada (chamado "UpdatePaid", de 3 paramaters como mostrado abaixo) assim:
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();
Ele funciona muito bem ... mas a coisa realmente estranha é que ele fez não até que eu ponha no odc.Prepare () chamada.
< br> a minha pergunta é assim: eu preciso fazer isso o tempo todo quando se trabalha com OleDb armazenados procs / consultas? Por quê? Eu também tenho outro projeto chegando onde eu vou ter que fazer a mesma coisa com um SqlDbCommand ... eu tenho que fazê-lo com aqueles, também?
Solução
Este é chamado, curiosamente, uma declaração preparada, e eles são realmente muito bom. Basicamente o que acontece é que você quer criar ou obter uma instrução SQL (insert, delete, update) e em vez de passar valores reais, você passa "?" como um local reservado. Isto é tudo muito bem, exceto o que nós queremos é os nossos valores para conseguir passar em vez do "?".
Por isso, prepare a instrução então ao invés de "?", Passamos em parâmetros como você tem acima que vão ser os valores que vão em no lugar dos suportes do lugar.
Preparar analisa a cadeia para encontrar onde os parâmetros podem substituir os pontos de interrogação então tudo que você tem a fazer é inserir os dados de parâmetros e executar o comando.
Dentro oledb, consultas armazenadas são declarações preparadas, de modo a preparar é necessária. Eu não usei consultas armazenadas com SQLDB, então eu teria que adiar para as 2 respostas anterior.
Outras dicas
Eu não usá-lo com SqlDbCommand. Parece que um bug para mim que é necessário . Ele só deve ser bom ter se você estiver indo para chamar um procedimento várias vezes em uma fileira. Talvez eu esteja errado e há uma nota na documentação sobre os prestadores que amam este apelo muito.
Você está usando o provedor OLEDB JET? ou MSDASQL + ODBC JET?
Você não precisa Prepare()
chamada, mas acredito que o motorista / provedor de dependentes.
Você definitivamente não precisa usar Prepare()
para System.Data.SqlClient
.