insert dbexpress+delphi7+oracle
Estou com um problema na empresa no qual quero fazer um insert no B.D oracle utilizando o Dbexpress.
SQLConnection conectado ao banco. sqlquery1 conectado ao sqlconnection. DataSetProvider1 conectado ao sqlquery1. Clientdataset1 conectado ao DataSetProvider1. Datasource1 conectado ao Clientdataset1. No buttonclick esta o seguinte comando:
sqlquery1.Close;
sqlquery1.Open;
sqlquery1.SQL.Text := insert into pcbairro (codbairro,descricao) values (:CODBAIRRO,:BAIRRO);
sqlquery1.ParamByName(CODBAIRRO).Value := EDIT1.Text;
sqlquery1.ParamByName(BAIRRO).Value := EDIT2.Text;
sqlquery1.ExecSQL;
Esse comando inseriu no banco, porém com seguinte erro:
ACCESS VIOLATION AT ADDRESS 01253A24 MODULE DBEXPORA.DLL.
Estou fazendo um teste nesse comando simples para depois implementar o insert atraves de outras tabelas.
Obrigado!
SQLConnection conectado ao banco. sqlquery1 conectado ao sqlconnection. DataSetProvider1 conectado ao sqlquery1. Clientdataset1 conectado ao DataSetProvider1. Datasource1 conectado ao Clientdataset1. No buttonclick esta o seguinte comando:
sqlquery1.Close;
sqlquery1.Open;
sqlquery1.SQL.Text := insert into pcbairro (codbairro,descricao) values (:CODBAIRRO,:BAIRRO);
sqlquery1.ParamByName(CODBAIRRO).Value := EDIT1.Text;
sqlquery1.ParamByName(BAIRRO).Value := EDIT2.Text;
sqlquery1.ExecSQL;
Esse comando inseriu no banco, porém com seguinte erro:
ACCESS VIOLATION AT ADDRESS 01253A24 MODULE DBEXPORA.DLL.
Estou fazendo um teste nesse comando simples para depois implementar o insert atraves de outras tabelas.
Obrigado!
Marcos Souza
Curtidas 0
Respostas
Joel Rodrigues
23/05/2012
Provavelmente é algum componente não instanciado. Depure o código para ver exatamente onde está ocorrendo o problema.
GOSTEI 0
Marcos Souza
23/05/2012
Nao sei se fiz da forma correta, pois esses comandos estao no tbutton. O sqlquery1 na verdade consta apenas uma consulta simples (select * from pcbairro), apenas para fazer conexao com sqlconnection. A depuração deu erro na linha abaixo:
sqlquery1.ExecSQL;
sqlquery1.ExecSQL;
GOSTEI 0
Joel Rodrigues
23/05/2012
Existe mais algum comando na tela que possa estar sendo executado?
GOSTEI 0
Marcos Souza
23/05/2012
Não. É somente isso mesmo. Insert basico para depois ser implementado.
GOSTEI 0
Joel Rodrigues
23/05/2012
Bom, se é uma SQLQuery para inserção, você não precisa do SELECT inicial, certo? Use um controle para cada função. Retire o select que consta na query e os comandos Close e o Open antes da execução. Vejamos no que dá.
GOSTEI 0
Marcos Souza
23/05/2012
Caso eu retire o comando sql da query o mesmo nao fica ativo. Apresenta o seguinte erro ao tentar iniciar a query:
missing query, table name or procedure name.
missing query, table name or procedure name.
GOSTEI 0
Joel Rodrigues
23/05/2012
Cara, vamos começar o tratamento de choque:
- como é uma instrução de inserção, você não precisa de DataSetProvider nem ClientDataSet, desligue-os da SQLQuery.
- Defina a instrução de inserção em tempo de design e, em runtime, passe apenas os parâmetros.
Vamos ver no que dá...
- como é uma instrução de inserção, você não precisa de DataSetProvider nem ClientDataSet, desligue-os da SQLQuery.
- Defina a instrução de inserção em tempo de design e, em runtime, passe apenas os parâmetros.
Vamos ver no que dá...
GOSTEI 0
Marcos Souza
23/05/2012
Bom, nao sou programador, portanto desculpe por talvez nao ter entendido o que quis dizer. Fiz o seguinte, coloquei o comando: insert into pcbairro (codbairro,descricao) values (:CODBAIRRO,:BAIRRO) na propriedade SQL da query e deixei no button apenas os parametros. Quando fui ativar a query aparece a seguinte mensagem: CANNOT INSERT NULL INTO (BASEDADOS.PCBAIRRO.CODBAIRRO).
Sera que o problema nao pode ser por causa que o campo DESCRICAO é um campo CHAR, no qual aceita qualquer tipo de caracteres e o oracle para entender esses caracteres, é necessaio estar com aspas simples . Caso eu informe dentro das aspas simples o proprio delphi informa erro: MISSING OPERATOR OR SIMICOLON.
Sera que o problema nao pode ser por causa que o campo DESCRICAO é um campo CHAR, no qual aceita qualquer tipo de caracteres e o oracle para entender esses caracteres, é necessaio estar com aspas simples . Caso eu informe dentro das aspas simples o proprio delphi informa erro: MISSING OPERATOR OR SIMICOLON.
GOSTEI 0
Joel Rodrigues
23/05/2012
Você não deve ativar a query, deve apenas chamar o ExecSQL a partir do código.
GOSTEI 0
Marcos Souza
23/05/2012
Mesmo nao ativando, eu executo, preencho os edits e quando clico no button ele informa a mesma mensagem:
cannot insert null...
cannot insert null...
GOSTEI 0
Marcos Souza
23/05/2012
Joel, consegui fazer o insert da seguinte forma:
sqlquery1.Close;
SQLQUERY1.Open;
SQLQUERY1.SQL.Clear;
sqlquery1.SQL.Add(insert into pcbairro(codbairro,descricao) values (+QuotedStr(EDIT1.Text)+,+QuotedStr(EDIT2.Text)+));
//sqlquery1.ParamByName(CODBAIRRO).Value := EDIT1.Text;
//sqlquery1.ParamByName(BAIRRO).AsString := EDIT2.Text;
SQLQUERY1.ExecSQL(TRUE);
Caso possa me dar mais alguma dica referente o porque o registro nao inclui duas vezes seguidas. Ex: inseri o codbairro 1 e sua descricao. Quando informo manualmente codigo 2 e sua descricao, o delphi entende que ainda é codigo 1, entao fica dois codigos 1 gravado no banco. Sabe como proceder quanto a isso?
sqlquery1.Close;
SQLQUERY1.Open;
SQLQUERY1.SQL.Clear;
sqlquery1.SQL.Add(insert into pcbairro(codbairro,descricao) values (+QuotedStr(EDIT1.Text)+,+QuotedStr(EDIT2.Text)+));
//sqlquery1.ParamByName(CODBAIRRO).Value := EDIT1.Text;
//sqlquery1.ParamByName(BAIRRO).AsString := EDIT2.Text;
SQLQUERY1.ExecSQL(TRUE);
Caso possa me dar mais alguma dica referente o porque o registro nao inclui duas vezes seguidas. Ex: inseri o codbairro 1 e sua descricao. Quando informo manualmente codigo 2 e sua descricao, o delphi entende que ainda é codigo 1, entao fica dois codigos 1 gravado no banco. Sabe como proceder quanto a isso?
GOSTEI 0
Marcos Souza
23/05/2012
Achei o problema. Debuguei novamente e vi que a linha abaixo esta abrindo novamente a query e ocasionava o erro. Agora esta funcionando perfeitamente e ja vou incrementar o restante do insert.
SQLQUERY1.Open;
Obrigado!
SQLQUERY1.Open;
Obrigado!
GOSTEI 0