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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top