Die Community zu .NET und Classic VB.
Menü

FAQ 0097: Warum erhalte ich bei MySQL einen Fehler, wenn ich einen String oder ein BigInt einfügen oder ändern möchte?

 von 

Frage 

Warum meldet MySQL "Fehler bei einem aus mehreren Schritten bestehenden Vorgang", wenn ich einen String oder ein BigInt einfügen oder ändern möchte?

Antwort  

Der MyODBC-Treiber "optimiert" standardmäßig die Länge von Textfeldern variabler Länge (Datentyp: VARCHAR) im Abfrageergebnis, welches man clientseitig durchläuft. Die Feldlänge wird auf die Länge des längsten Eintrages beschränkt. Weist man dem Datenwort einen String zu, der länger als die aktuelle Maximallänge des Strings, aber kürzer als die zulässige Maximallänge ist, erhält man besagte Fehlermeldung.

Es gibt - schlecht dokumentierte - Parameter, die man im Connectionstring angeben muss, mit denen man dieses Verhalten beeinflussen kann. Diese sind im öffentlich zugänglichen Quellcode des MyODBC-Treibers einsehbar (MyODBC.h).

' Don't Optimize Column Width
Const FLAG_FIELD_LENGTH As Long = 1         
' Return Matching Rows
Const FLAG_FOUND_ROWS As Long = 2           
' Trace driver calls (c:\\myodbc.log)
Const FLAG_DEBUG As Long = 4                
' Allow BIG results.
Const FLAG_BIG_PACKETS As Long = 8          
' Don't prompt on Connect
Const FLAG_NO_PROMPT As Long = 16           
' Enable Dynamic Cursor
Const FLAG_DYNAMIC_CURSOR As Long = 32      
' Ignore the schema defination - Ignore # in #.Table
Const FLAG_NO_SCHEMA As Long = 64           
' No default cursor - Use Manager Cursors
Const FLAG_NO_DEFAULT_CURSOR As Long = 128  
' Don't Use Setlocale
Const FLAG_NO_LOCALE As Long = 256          
' Pad CHAR to Full Length
Const FLAG_PAD_SPACE As Long = 512          
' Return Table Names in SQLDescribeCol
Const FLAG_FULL_COLUMN_NAMES As Long = 1024 
' Use Compressed Protocol
Const FLAG_COMPRESSED_PROTO As Long = 2048  
' Ignore Space After Function Names
Const FLAG_IGNORE_SPACE As Long = 4096      
' Force Use of Named Pipes
Const FLAG_NAMED_PIPE As Long = 8192        
' Change BIGINT Columns to INT
Const FLAG_NO_BIGINT As Long = 16384        
' No Catalog (exp)
Const FLAG_NO_CATALOG As Long = 32768       
' Read Options From C:\\my.cnf
Const FLAG_USE_MYCNF As Long = 65536        
' Safety (Check this if you have problems)
Const FLAG_SAFE As Long = 131072            
' Disable Transactions
Const FLAG_NO_TRANSACTIONS As Long = 262144 
' Save queries to log file (c:\myodbc.sql)
Const FLAG_LOG_QUERY As Long = 524288       
' Don't Cache Results(only for forward-only cursor)
Const FLAG_NO_CACHE As Long = 1048576       
' Force use of Forward-only cursors
Const FLAG_FORWARD_CURSOR As Long = 2097152

Listing 1: VB-Übersetzung der Parameter-Deklarationen

Wenn man zum Zugriff auf eine MySQL-Datenbank eine System-DSN erstellt, sind die ersten beiden Parameter standardmäßig vorgegeben (Optionen-Dialog des MyODBC-Treibers beim Anlegen einer System-DSN). Daher ist es ratsam, sie bei einer DSN-losen Verbindung nicht zu übersehen. Die Kommentare in der VB-Deklarationen sind die Texte zu jeder Checkbox im Optionen-Dialog.

Verwendet man in der MySQL-Datenbank den Datentyp BIGINT, ist es ratsam auch den Parameter FLAG_NO_BIGINT zu beachten. Er sagt dem ODBC-Treiber, daß BIGINT-Werte in INT-Werte konvertiert werden, und daher bearbeitet werden können.

'   Servername
Const cstrMySQLSvr As String = "localhost"
'   Name der Datenbank
Const cstrDatabase As String = "test"
'   Port, an dem der DB-Server lauscht (Leerstring für Standard)
Const cstrPort As String = vbNullString
'   MyODBC-Optionen
Const cintOption As Long = FLAG_FIELD_LENGTH Or _
                           FLAG_FOUND_ROWS Or _
                           FLAG_NO_BIGINT

strConnection = "Provider=MSDASQL; " & _
                "Driver=MySQL ODBC 3.51 Driver; " & _
                "Server=" & cstrMySQLSvr & "; " & _
                "Port=" & cstrPort & "; " & _
                "Database=" & cstrDatabase & "; " & _
                "Option=" & CStr(cintOption) & "; "

Listing 2: Empfohlener Aufbau eines Connectionstrings für MyODBC 3.51

Diese FAQ ist eine Ergänzung zu FAQ 0031: Verbindung zu einer MySQL-Datenbank

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.