Hola
Quiero actualizar una base de datos a través de la función Nueva consulta SQL:
Names Default To Here( 1 );
obj = New SQL Query(
Connection("DB connection string"),
Custom SQL "
UPDATE table
SET Column_1 = 1
where Column_2 = '2'
")
);
Error_Msg = Log capture( obj << Run;);Recibo el siguiente mensaje de error:
""
Error running SQL Query:
[Server] Invalid object name table
Log Capture solo obtiene la cadena "" vacía. Entonces no sé si la consulta fue exitosa ya que devuelve una cadena vacía cuando no ocurre ningún error.
Tema similar pero con base de datos abierta: https://community.jmp.com/t5/Discussions/Catching-database-error-message/mp/6749#M6743
Gracias
Version corta:
E_Msg = Log capture(
EXECUTE SQL(
create database connection("DB_String");
,
"SQL string"
);
);Quizás tengas más suerte con la función EJECUTAR SQL. Escribí una función encima de EXECUTE SQL llamada LOG_EXECUTE_SQL, que busca errores y, si los encuentra, muestra un cuadro de texto con el error y el SQL que lo causó. También puede mostrar el SQL para cualquier llamada configurando una variable global.
//------------------------------------------------------------------------------
/*
Function Name: log_execute_sql
Description: Execute SQL and trap ODBC errors found in the log file. If any are
found, display a warning message to the user. If the global variable
::g_log_execute_sql_debug flag is set to 1, display the SQL before
executing it
Arguments:
_caller Calling program. This will be included in the error message
_dbc database connection created with create database connection call
_sql sql statement to run
_invisible If 1, set the invisible flag. If 0, don't set it.
_tbl_name Optional table name to give the returned results table
Subprograms: execute sql
clear log
get log
Returns: pointer to dataset
Comments:
This preference is optional but good to use:
pref(ODBC Hide Connection String(1)); // Don't show connection string in dataset
Example calls:
1. Retrieve data from a table into an invisible dataset
pname = "Main Program";
dbc = Create Database Connection(::db_dsn); // ::db_dsn contains your database connection string
// The two colons means this is a global variable btw
// Get values from PARAMETERS table
sql_statement =
"SELECT rp.parameter_name, rp.parameter_value
FROM myschema.my_parameters rp";
param_dataset = log_execute_sql(pname, dbc, sql_statement, 1, "My Parameters");
close database connection(dbc);
2. Execute an INSERT statement:
dbc = Create Database Connection(::db_dsn); // ::db_dsn contains your database connection string
sql_statement = evalinsert(
"INSERT INTO myschema.my_activity_log
(user_created, date_created, my_section, activity, parameter1, value1, parameter2, value2,
parameter3, value3, parameter4, value4, parameter5, value5, parameter6, value6, parameter7, value7,
parameter8, value8)
VALUES ('^one_current_user_id^', CURRENT_DATE, 'DASHBOARD', 'REFRESH', 'Product Name', '^product_name_txt^',
'Owner', '^owner_txt^', 'Search Event Text', '^search_event_txt^', 'Date From', '^date_from_txt^',
'Date To', '^date_to_txt^', 'Alert Status', '^alert_status_txt^', 'Event Types', '^concat_event_types_list^',
'Alert Types', '^concat_alert_types_list^')");
// Run this SQL. No table is retrieved as it's a simple insert
log_execute_sql(pname, dbc, sql_statement, 0, "");
// Close the database connection - end of initialization queries
Close Database Connection(dbc);
*/
log_execute_SQL = function({_caller, _dbc, _sql, _invisible, _tbl_name},
{Default Local},
if (isempty(_dbc),
_nw = new window("log_execute_sql: Empty Value", << modal,
textbox("Error in log_execute_sql: The database connection is empty."),
);
throw("Empty database connection string");
);
if (isempty(_sql) | _sql == "",
_nw = new window("log_execute_sql: Empty Value", << modal,
textbox("Error in log_execute_sql: The SQL statement is empty."),
);
throw("Empty SQL string");
);
// Check the debug flag
_debug = 0;
if (! is empty(global:g_log_execute_sql_debug),
_debug = global:g_log_execute_sql_debug;
);
if (_debug,
_nw = new window("log_execute_sql DEBUG", << modal,
lineup box(ncol(2),
text box("_caller: "), text box(_caller),
text box("_dbc: "), text box(char(_dbc)),
text box("_invisible: "), text box(char(_invisible)),
text box("_tbl_name: "), text box(_tbl_name),
),
panel box("SQL",
sql_teb = text edit box(_sql)
),
hlistbox(
_cb = check box("Turn off subsequent debug output"),
_tb = text box(" "),
_bb = button box("OK",
is_checked = _cb << get(1);
if (is_checked,
global:g_log_execute_sql_debug = 0;
);
),
),
sql_teb << set nlines(40) << set width(500);
);
);
// OK we're good to go now.
batch interactive(1); // New 5-17-2018 force all errors to go to the log
_log_contents = log capture(
if (_invisible,
_dt = execute sql(_dbc, _sql, invisible, _tbl_name);
,
_dt = execute sql(_dbc, _sql, _tbl_name);
);
);
batch interactive(0); // New 5-17-2018 errors will not be forced to go to the log
// Check the log window for ODBC errors
// _log_contents = get log();
_found_error = 0;
crlf = hex to char("0D0A");
if (contains(_log_contents, "[Oracle][ODBC]") | contains(uppercase(_log_contents), "ERROR"), // Looking for errors
// then
_found_error = 1;
_log_list = words(_log_contents, crlf);
_error_msg = _log_list[1];
);
if (_found_error,
// then
// print(_sql); // Write the SQL out to the log window
_nw = new window("log_execute_sql: Oracle ODBC Error", << modal,
textbox("An Oracle error occurred in " || _caller || ": "),
panel box("Please email to technical support:",
sql_teb = text edit box(evalinsert(
"Calling Program: ^_caller^
Error Message: ^_error_msg^
SQL:
^_sql^"))),
sql_teb << set nlines(30) << set width(500),
);
);
// Return the table pointer
_dt;
); // end log_execute_sql
Lo siento, leí mal tu pregunta.
¿Podrías probar el comando Ejecutar primer plano?
Error_Msg = Log Capture( obj << run foreground );
Hola @jara95
Gracias por su respuesta
Deliberadamente hago una declaración SQL falsa para forzar un mensaje de error.
Actualizo/amplié una base de datos existente a alta velocidad y necesito verificar que la nueva entrada esté realmente presente. Si se produce un error, se debe alertar al usuario con un mensaje de error (en el mejor de los casos, el que recibí de SQL). La solución alternativa sería realizar una segunda declaración SQL para solicitar la nueva entrada que abre una nueva tabla de datos para verificar y luego cerrar nuevamente.
Esto necesitaría mucho más tiempo y generaría más "estrés" en el servidor y no da idea de qué salió mal.
Hi @Mauro_Gerber ,
¿Especificaste una base de datos predeterminada en la cadena de conexión con "Database=myDBname"?
¿O mediante la interfaz de usuario del controlador ODBC?
Parece que la tabla no se encuentra en la base de datos "predeterminada" que está consultando.
salud,
estan
Encontré tailcontents = Get Log (- 5 ); código para acceder al Registro, pero aún no se puede acceder al mensaje:
{""}<BR />Error running SQL Query:
[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name '*table name*'. [SQLSTATE=42S02]Solo obtengo el {""} del archivo de registro como ocurre con el registro de captura. incluso cuando se lee el conjunto mediante Get Log ();
Parece que le falta el paréntesis de apertura después del argumento SQL personalizado.
Creo que el mensaje de error hace referencia a "tabla" después de la actualización. ¿Es ese el nombre real o es una variable en la que se almacena el nombre? Además, ¿debería citarse el nombre de la tabla en SQL?