Hallo
Ich möchte eine Datenbank über die Funktion „Neue SQL-Abfrage“ aktualisieren:
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;);Ich erhalte die folgende Fehlermeldung:
""
Error running SQL Query:
[Server] Invalid object name table
Log Capture erhält nur die leere Zeichenfolge „“. Daher weiß ich nicht, ob die Abfrage erfolgreich war, da sie eine leere Zeichenfolge zurückgibt, wenn kein Fehler auftritt.
ähnliches Thema, aber mit offener Datenbank: https://community.jmp.com/t5/Discussions/Catching-database-error-message/mp/6749#M6743
Möglicherweise möchten Sie Ihren Code mit diesen Anweisungen umgeben, um alle Fehlermeldungen in das Protokoll zu erzwingen:
Batch interaktiv(1);
Batch interaktiv(0);
Möglicherweise haben Sie mit der Funktion EXECUTE SQL mehr Glück.Ich habe zusätzlich zu EXECUTE SQL eine Funktion namens LOG_EXECUTE_SQL geschrieben, die nach Fehlern sucht und, wenn sie gefunden wird, ein Textfeld mit dem Fehler und der SQL-Anweisung anzeigt, die ihn verursacht hat.Sie können auch die SQL für alle Aufrufe anzeigen, indem Sie eine globale Variable festlegen.
//------------------------------------------------------------------------------
/*
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
Entschuldigung, ich habe Ihre Frage falsch verstanden.
Könnten Sie den Befehl „Foreground ausführen“ ausprobieren?
Error_Msg = Log Capture( obj << run foreground );
Hallo @jara95
Danke für Ihre Antwort
Ich mache absichtlich eine falsche SQL-Anweisung, um eine Fehlermeldung zu erzwingen.
Ich aktualisiere/erweitere eine bestehende Datenbank mit hoher Geschwindigkeit und muss überprüfen, ob der neue Eintrag tatsächlich vorhanden ist. Wenn ein Fehler auftritt, sollte der Benutzer mit einer Fehlermeldung benachrichtigt werden (im besten Fall die, die ich von SQL erhalten habe). Die Problemumgehung wäre, eine zweite SQL-Anweisung zu erstellen, um nach dem neuen Eintrag zu fragen, wodurch eine neue Datentabelle zur Überprüfung geöffnet und dann wieder geschlossen wird.
Dies würde viel mehr Zeit in Anspruch nehmen und den Server stärker belasten und gibt keinen Hinweis darauf, was schief gelaufen ist.
Hallo @Mauro_Gerber ,
Haben Sie in der Verbindungszeichenfolge eine Standarddatenbank angegeben? „Datenbank=meinDBname“
oder über die Benutzeroberfläche des ODBC-Treibers?
Es scheint, dass die Tabelle nicht in der „Standard“-Datenbank gefunden wird, die Sie abfragen.
Prost,
Stan
ich fand die tailcontents = Protokoll abrufen ( (- 5 ); Code für den Zugriff auf das Protokoll, aber auf die Nachricht kann immer noch nicht zugegriffen werden:
{""}<BR />Error running SQL Query:
[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name '*table name*'. [SQLSTATE=42S02]Ich bekomme nur die {""} aus der Protokolldatei wie beim Capture-Protokoll. auch beim Auslesen des gesamten Via Protokoll abrufen ();
Es sieht so aus, als ob Ihnen die öffnende Klammer nach dem Argument „Custom SQL“ fehlt.
Ich denke, die Fehlermeldung bezieht sich nach dem Update auf „Tabelle“. Ist das der tatsächliche Name oder handelt es sich um eine Variable, in der der Name gespeichert ist? Sollte der Name der Tabelle auch in SQL in Anführungszeichen gesetzt werden?