ORA-01036: Error con C++ Builder
Estoy trabajando con C++ Builder 5 contra una base de datos en Oracle y al efectuar un INSERT en una tabla desde el programa me da este error; sin embargo, si ejecuto el INSERT desde una herramienta externa (SqlDbx) la inserci贸n de la fila es correcta. El c贸digo que estoy usando es este:
Query2->Close();
Query2->DeclareVariable(\"Formato\" , otString);
Query2->DeclareVariable(\"Version\" , otString);
Query2->DeclareVariable(\"Orden\" , otInteger);
Query2->DeclareVariable(\"Etiqueta\", otString);
Query2->DeclareVariable(\"Longitud\", otInteger);
Query2->DeclareVariable(\"Mascara\" , otString);
Query2->DeclareVariable(\"Campo\" , otString);
Query2->SQL->Text = \"INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES (\\'I\\', :Formato, :Version, :Orden, :Etiqueta, 0, 0, :Longitud, :Mascara, :Campo)\";
try
{
Query2->SetVariable(\"Formato\" , Trim(cFileName.SubString(1, cFileName.Pos(\".XML\") - 1)));
Query2->SetVariable(\"Version\" , Date().FormatString(\"yyyymmdd\"));
Query2->SetVariable(\"Orden\" , nItem + 1);
Query2->SetVariable(\"Etiqueta\", cAux);
Query2->SetVariable(\"Longitud\", nLongitud);
Query2->SetVariable(\"Mascara\" , cMascara);
Query2->SetVariable(\"Campo\" , cCampo);
Query2->Execute();
}
catch (const Exception &E)
{
Application->Terminate();
return;
}
Y la orden que se genera es esta:
INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES (\\'I\\', \\'AMEM001\\', \\'20091020\\', 1, \\'OPCION\\', 0, 0, 1, NULL, \\'OPCION\\')
Query2->Close();
Query2->DeclareVariable(\"Formato\" , otString);
Query2->DeclareVariable(\"Version\" , otString);
Query2->DeclareVariable(\"Orden\" , otInteger);
Query2->DeclareVariable(\"Etiqueta\", otString);
Query2->DeclareVariable(\"Longitud\", otInteger);
Query2->DeclareVariable(\"Mascara\" , otString);
Query2->DeclareVariable(\"Campo\" , otString);
Query2->SQL->Text = \"INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES (\\'I\\', :Formato, :Version, :Orden, :Etiqueta, 0, 0, :Longitud, :Mascara, :Campo)\";
try
{
Query2->SetVariable(\"Formato\" , Trim(cFileName.SubString(1, cFileName.Pos(\".XML\") - 1)));
Query2->SetVariable(\"Version\" , Date().FormatString(\"yyyymmdd\"));
Query2->SetVariable(\"Orden\" , nItem + 1);
Query2->SetVariable(\"Etiqueta\", cAux);
Query2->SetVariable(\"Longitud\", nLongitud);
Query2->SetVariable(\"Mascara\" , cMascara);
Query2->SetVariable(\"Campo\" , cCampo);
Query2->Execute();
}
catch (const Exception &E)
{
Application->Terminate();
return;
}
Y la orden que se genera es esta:
INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES (\\'I\\', \\'AMEM001\\', \\'20091020\\', 1, \\'OPCION\\', 0, 0, 1, NULL, \\'OPCION\\')
El error que comentas es bastante obvio, revisa el codigo con atenci贸n y enseguida lo veras.
Y al estructura de la tabla, que no me hab铆a dado cuenta de incluirla, es esta:
CREATE TABLE AUDITORIA.AUDI_FORMATOS_2
(
APLICATIVO VARCHAR2(2) NOT NULL,
FORMATO VARCHAR2(11) NOT NULL,
VERSION VARCHAR2(11) NOT NULL,
ORDEN NUMBER NOT NULL,
ETIQUETA VARCHAR2(31),
SEPARADOR NUMBER,
CONCATENADO NUMBER,
LONGITUD NUMBER,
MASCARA VARCHAR2(25),
CAMPO VARCHAR2(21)
)
TABLESPACE AUDITORIA
LOGGING
NOCACHE
STORAGE (BUFFER_POOL DEFAULT);
CREATE UNIQUE INDEX PK_AUDI_FORMATOS_2 ON AUDITORIA.AUDI_FORMATOS_2 (APLICATIVO, FORMATO, VERSION, ORDEN);
CREATE TABLE AUDITORIA.AUDI_FORMATOS_2
(
APLICATIVO VARCHAR2(2) NOT NULL,
FORMATO VARCHAR2(11) NOT NULL,
VERSION VARCHAR2(11) NOT NULL,
ORDEN NUMBER NOT NULL,
ETIQUETA VARCHAR2(31),
SEPARADOR NUMBER,
CONCATENADO NUMBER,
LONGITUD NUMBER,
MASCARA VARCHAR2(25),
CAMPO VARCHAR2(21)
)
TABLESPACE AUDITORIA
LOGGING
NOCACHE
STORAGE (BUFFER_POOL DEFAULT);
CREATE UNIQUE INDEX PK_AUDI_FORMATOS_2 ON AUDITORIA.AUDI_FORMATOS_2 (APLICATIVO, FORMATO, VERSION, ORDEN);
Lo siento Andoni: Tal vez sea obvio pero le llevo dadas tantas vueltas a ese trozo que no veo lo que a ti te parece tan evidente. Es m谩s, he reemplazado los DeclareVariable / SetVariable por c贸digo puro y duro:
Query2->Close();
Query2->SQL->Clear();
Query2->SQL->Text = "INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES ('I', '" + Trim(cFileName.SubString(1, cFileName.Pos(".XML") - 1)) + "', '" + Date().FormatString("yyyymmdd") + "', " + IntToStr(nItem + 1) + ", '" + Trim(cAux) + "', 0, 0, " + IntToStr(nLongitud) + ", " + cMascara + ", '" + Trim(cCampo) + "')";
try
{
Query2->Execute();
}
catch (const Exception &E)
{
Application->Terminate();
return;
}
Se genera el mismo query:
INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES ('I', 'AMEM001', '20091021', 1, 'OPCION', 0, 0, 1, NULL, 'OPCION')
Pero sigue dando el mismo error.
Query2->Close();
Query2->SQL->Clear();
Query2->SQL->Text = "INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES ('I', '" + Trim(cFileName.SubString(1, cFileName.Pos(".XML") - 1)) + "', '" + Date().FormatString("yyyymmdd") + "', " + IntToStr(nItem + 1) + ", '" + Trim(cAux) + "', 0, 0, " + IntToStr(nLongitud) + ", " + cMascara + ", '" + Trim(cCampo) + "')";
try
{
Query2->Execute();
}
catch (const Exception &E)
{
Application->Terminate();
return;
}
Se genera el mismo query:
INSERT INTO AUDI_FORMATOS_2 (Aplicativo, Formato, Version, Orden, Etiqueta, Separador, Concatenado, Longitud, Mascara, Campo) VALUES ('I', 'AMEM001', '20091021', 1, 'OPCION', 0, 0, 1, NULL, 'OPCION')
Pero sigue dando el mismo error.
Ya est谩 aclarado. Ten铆as raz贸n Andoni: Es una tonter铆a; bastaba con poner ANTES de los DeclareVariable Query2->DeleteVariables().
