Bonjour
Je souhaite mettre à jour une base de données via la fonction New SQL Query :
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;);Je reçois le message d'erreur suivant:
""
Error running SQL Query:
[Server] Invalid object name table
Log Capture n'obtient que la chaîne "" vide. Je ne sais donc pas si la requête a réussi puisqu'elle renvoie une chaîne vide lorsqu'aucune erreur ne se produit.
sujet similaire mais avec base de données ouverte : https://community.jmp.com/t5/Discussions/Catching-database-error-message/mp/6749#M6743
Merci
Version courte:
E_Msg = Log capture(
EXECUTE SQL(
create database connection("DB_String");
,
"SQL string"
);
);Vous aurez peut-être plus de chance avec la fonction EXECUTE SQL.J'ai écrit une fonction au-dessus d'EXECUTE SQL appelée LOG_EXECUTE_SQL, qui recherche les erreurs et, si elle est trouvée, affiche une zone de texte avec l'erreur et le SQL qui l'a provoquée.Vous pouvez également afficher le SQL pour tous les appels en définissant une variable globale.
//------------------------------------------------------------------------------
/*
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
Désolé, j'ai mal lu votre question.
Pourriez-vous essayer la commande Exécuter le premier plan ?
Error_Msg = Log Capture( obj << run foreground );
Bonjour @jara95
Merci pour votre réponse
Je fais délibérément une fausse instruction SQL pour forcer un message d'erreur.
Je mets à jour/étends une base de données existante à grande vitesse et je dois vérifier que la nouvelle entrée est réellement présente. Si une erreur se produit, l'utilisateur doit être alerté avec un message d'erreur (dans le meilleur des cas, celui que j'ai reçu de SQL). La solution de contournement serait de faire une deuxième instruction SQL pour demander la nouvelle entrée qui ouvre une nouvelle table de données à vérifier puis à refermer.
Cela prendrait beaucoup plus de temps et mettrait plus de « stress » sur le serveur et ne donne aucune idée de ce qui n'a pas fonctionné.
Salut @Mauro_Gerber ,
avez-vous spécifié une base de données par défaut dans la chaîne de connexion avec "Base de données = mon nom de base de données"
ou via l'interface utilisateur du pilote ODBC ?
Il semble que la table ne soit pas trouvée dans la base de données « par défaut » sur laquelle vous effectuez la requête.
acclamations,
Stan
J'ai trouvé le contenu de la queue = Obtenir le journal (- 5 ); code pour accéder au Log, mais le message n'est toujours pas accessible :
{""}<BR />Error running SQL Query:
[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name '*table name*'. [SQLSTATE=42S02]Je reçois uniquement le {""} du fichier journal comme avec le journal de capture. même en lisant l'intégralité via Obtenir le journal ();
On dirait qu'il vous manque la parenthèse ouvrante après l'argument SQL personnalisé.
Je pense que le message d'erreur fait référence à "table" après la mise à jour. Est-ce le nom réel ou est-ce une variable dans laquelle le nom est stocké ? De plus, le nom de la table doit-il être cité en SQL ?