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