ArcSDESQLExecute (arcpy)
Zusammenfassung
Die ArcSDESQLExecute-Klasse bietet eine Möglichkeit zur Ausführung von SQL-Anweisungen über eine ArcSDE-Verbindung.
Diskussion
- ArcSDE- und GDB-Systemtabellen dürfen nur mit der ArcGIS-Software geändert werden. Diese Systemtabellen können beschädigt werden, wenn sie direkt mit SQL bearbeitet werden.
- Die Bearbeitung versionierter Daten per SQL sollte nur über versionierte Sichten erfolgen.
- Bei Geodatabases, die in einem relationalen Datenbankmanagementsystem (DBMS) mit DBMS-Datentypen und -Tabellenformaten implementiert sind, können Sie die SQL des DBMS nutzen, um mit den in der Datenbank gespeicherten Informationen zu arbeiten.
- Erfolgt der Zugriff auf die Informationen in einer Geodatabase über SQL, können externe Anwendungen auf die Tabellendaten zugreifen, die von der Geodatabase verwaltet werden. Bei diesen externen Anwendungen kann es sich um nicht räumliche Datenbankanwendungen oder benutzerdefinierte räumliche Anwendungen handeln, die in einer anderen Umgebung als ArcObjects entwickelt wurden. Wenn Sie über SQL auf die Geodatabase zugreifen, stehen jedoch nicht alle Geodatabase-Funktionen zur Verfügung, zum Beispiel Topologie, Netzwerke, Terrains oder andere Klassen- bzw. Workspace-Erweiterungen.
- DBMS-Funktionen wie Trigger und gespeicherte Prozeduren können u. U. zur Verwaltung von Beziehungen zwischen Tabellen verwendet werden, die für bestimmte Geodatabase-Funktionen erforderlich sind. Wenn Sie jedoch die SQL-Befehle in der Datenbank ausführen, ohne diese zusätzliche Funktionalität zu berücksichtigen (z.B. beim Einfügen von Datensätzen in eine Business-Tabelle mit einer INSERT-Anweisung), wird die Geodatabase-Funktionalität umgangen und die Beziehungen zwischen den Daten in der Geodatabase können beschädigt werden.
- Lesen Sie möglichst in der ArcSDE- und Geodatabase-Dokumentation alle Informationen zur Verwendung von SQL bei ArcSDE- bzw. GDB-Objekten im DBMS, bevor Sie auf ArcSDE- oder GDB-Objekte zugreifen bzw. diese bearbeiten.
Syntax
Parameter | Erläuterung | Datentyp |
server |
Name of the server on which the database is installed. | String |
instance |
The port number | String |
database |
Name of the database. | String |
user |
The user name. | String |
password |
The password for the user name. | String |
Eigenschaften
Eigenschaft | Erläuterung | Datentyp |
transactionAutoCommit (Lesen und schreiben) |
The autocommit interval. This can be used to force intermediate commits after a specified number of features have been modified. | Integer |
Methodenübersicht
Methode | Erläuterung |
commitTransaction () |
No DML statements will be committed until the CommitTransaction method is called. Hinweis: A commit may also occur when the connection to ArcSDE it terminated (check specific DBMS documentation to see how each DBMS deals with a disconnect while in a transaction). |
execute (sql_statement) |
Sends the SQL statement to the database via an ArcSDE connection. If execute is run outside of a transaction, a commit will automatically take place once the SQL DML (INSERT, UPDATE, DELETE . . .) statement has been executed. |
rollbackTransaction () |
Rollback any DML operations to the previous commit. |
startTransaction () |
To control when your changes are committed to the database, call the startTransaction method before calling execute. This starts a transaction and no DML statements will be committed until the commitTransaction method is called. |
Methoden
Parameter | Erläuterung | Datentyp |
sql_statement |
The SQL statement. | String |
Codebeispiel
import arcpy
from arcpy import env
import sys
try:
# Make data path relative
#
env.workspace = sys.path[0]
# Two ways to create the object, which also creates the connection to ArcSDE.
# Using the first method, pass a set of strings containing the connection properties:
# <serverName>,<portNumber>,<version>,<userName>,<password>
# sdeConn = arcpy.ArcSDESQLExecute("gpserver3","5151","#","toolbox","toolbox")
# Using the second method pass the path to a valid ArcSDE connection file
#
sdeConn = arcpy.ArcSDESQLExecute("data\Connection to GPSERVER3.sde")
# Get the SQL statements, separated by ; from a text string.
#
SQLStatement = arcpy.GetParameterAsText(0)
SQLStatementList = SQLStatement.split(";")
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
# For each SQL statement passed in, execute it.
#
for sql in SQLStatementList:
print "Execute SQL Statement: " + sql
try:
# Pass the SQL statement to the database.
#
sdeReturn = sdeConn.execute(sql)
except Exception, ErrorDesc:
print ErrorDesc
sdeReturn = False
# If the return value is a list (a list of lists), display each list as a row from the
# table being queried.
if isinstance(sdeReturn, list):
print "Number of rows returned by query: " + str(len(sdeReturn)), "rows"
for row in sdeReturn:
print row
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
else:
# If the return value was not a list, the statement was most likely a DDL statment.
# Check its status.
if sdeReturn == True:
print "SQL statement: " + sql + " ran sucessfully."
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
else:
print "SQL statement: " + sql + " FAILED."
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
except Exception, ErrorDesc:
print Exception, ErrorDesc
except:
print "Problem executing SQL."
# WARNING - DO NOT USE ON VERSIONED TABLES OR FEATURE CLASSES.
# DO NOT USE ON ANY ArcSDE or GDB SYSTEM TABLES.
# DOING SO MAY RESULT IN DATA CORRUPTION.
import arcpy
from arcpy import env
import sys
try:
# Make data path relative (not relevant unless data is moved here and paths modified)
#
env.workspace = sys.path[0]
#Column name:value that should be in the record.
#
SQLvalues = {"STREET_NAM":"'EUREKA'"}
#Value that is incorrect if found in the above column.
#
badVal = "'EREKA'"
#List of tables to look in for the bad value.
#
tableList = ["streetaddresses_blkA","streetaddresses_blkB", "streetaddresses_blkC"]
# Two ways to create the object, which also creates the connection to ArcSDE.
# Using the first method, pass a set of strings containing the connection properties:
# <serverName>,<portNumber>,<version>,<userName>,<password>
#
sdeConn = arcpy.ArcSDESQLExecute("gpserver3","5151","#","toolbox","toolbox")
# Using the second method pass the path to a valid ArcSDE connection file
# sdeConn = arcpy.ArcSDESQLExecute("data\Connection to GPSERVER3.sde")
for tbl in tableList:
print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
for col, val in SQLvalues.items():
print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
#Check for the incorrect value in the column for the specific rows. If the table contains the
#incorrect value, correct it using the update SQL statement.
#
print "Analyzing table " + tbl + " for bad data: Column:" + col + " Value: " + badVal
try:
sql = "select OBJECTID," + col + " from " + tbl + " where " + col + " = " + badVal
print "Attempt to execute SQL Statement: " + sql
sdeReturn = sdeConn.execute(sql)
except Exception, ErrorDesc:
print ErrorDesc
sdeReturn = False
if isinstance(sdeReturn, list):
if len(sdeReturn) > 0:
print "Identified " + str(len(sdeReturn)) + " rows with incorrect data. Starting transaction for update."
# Start the transaction
#
sdeConn.startTransaction()
print "Transaction started....."
# Perform the update
#
try:
sql = "update " + tbl + " set " + col + "=" + str(val) + " where " + col + " = " + badVal
print "Changing bad value: " + badVal + " to the good value: " + val + " using update statement:\n " + sql
sdeReturn = sdeConn.execute(sql)
except Exception, ErrorDesc:
print ErrorDesc
sdeReturn = False
# If the update completed sucessfully, commit the changes. If not, rollback.
#
if sdeReturn == True:
print "Update statement: \n" + sql + " ran successfully."
# Commit the changes
#
sdeConn.commitTransaction()
print "Commited Transaction"
# List the changes.
#
try:
print "Displaying updated rows for visual inspection."
sql = "select OBJECTID," + col + " from " + tbl + " where " + col + " = " + val
print "Executing SQL Statement: \n" + sql
sdeReturn = sdeConn.execute(sql)
except Exception, ErrorDesc:
print ErrorDesc
sdeReturn = False
if isinstance(sdeReturn, list):
print len(sdeReturn), "rows"
for row in sdeReturn:
print row
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
else:
if sdeReturn == True:
print "SQL statement: \n" + sql + "\nran successfully."
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
else:
print "SQL statement: \n" + sql + "\nFAILED."
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
else:
print "SQL statement: \n" + sql + "\nFAILED. Rolling back all changes."
# Rollback changes
#
sdeConn.rollbackTransaction()
print "Rolled back any changes."
print "+++++++++++++++++++++++++++++++++++++++++++++\n"
else:
print "No records required updating."
# Disconnect and exit
del sdeConn
print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
except Exception, ErrorDesc:
print Exception, ErrorDesc
except:
print "Problem executing SQL."