MySQL-NullReferenceException

Alfred_

Erfahrenes Mitglied
Hi,
ich bekomme die Fehlermeldung: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Grundsätzlich geht es um die (Teil-)Übertragung von Tab1 nach Tab2. Tab1 und Tab2 sind ident. In Tab2 gibt es noch ein AutoIncr.-Feld. Die Variable k(SuchWert) wird korrekt angezeigt.
Was läuft das falsch? Vorweg schon ein Danke.
Code:
		Dim SuchWert As String
		Dim com3 As New MySqlCommand(("SELECT * FROM Tab2"), conn)
		Dim row As DataRow

		Try
			conn.Open()
			For o = 1 To lMax
				SuchWert = k(CInt(0 + (o - 1))) 'Kontrolle
				For Each row In dt.Rows
					Dim cmd As MySqlCommand
					'INSERT INTO tbl_temp2 (fld_id)	'//aus Referenzhandbuch!
					'Select tbl_temp1.fld_order_id
					'FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
					cmd = New MySqlCommand("INSERT INTO Tab2(Datum, Z1, Z2, Z3, Z4, Z5, Z6," & _
					"ID, top, H3, H4, H5, H6, Rde, Nr) VALUES (?Datum, ?Z1, ?Z2, ?Z3, ?Z4, ?Z5, ?Z6," & _
					"?ID, ?top, ?H3, ?H4, ?H5, ?H6, ?Rde, ?Nr) SELECT * FROM Tab1" + _
					"WHERE Rde='" & SuchWert & "'", conn)
					cmd.Parameters.Add("?Datum", MySqlDbType.Date)
					cmd.Parameters.Add("?A1", MySqlDbType.Int16)
					cmd.Parameters.Add("?A2", MySqlDbType.Int16)
					cmd.Parameters.Add("?A3", MySqlDbType.Int16)
					cmd.Parameters.Add("?A4", MySqlDbType.Int16)
					cmd.Parameters.Add("?A5", MySqlDbType.Int16)
					cmd.Parameters.Add("?A6", MySqlDbType.Int16)
					cmd.Parameters.Add("?ID", MySqlDbType.Int16)
					cmd.Parameters.Add("?top", MySqlDbType.Int16)
					cmd.Parameters.Add("?H3", MySqlDbType.Int16)
					cmd.Parameters.Add("?H4", MySqlDbType.Int16)
					cmd.Parameters.Add("?H5", MySqlDbType.Int16)
					cmd.Parameters.Add("?H6", MySqlDbType.Int16)
					cmd.Parameters.Add("?Rde", MySqlDbType.Int16)
					cmd.Parameters.Add("?Nr", MySqlDbType.Int16)
					cmd.Parameters("?Datum").Value = row!Datum
					cmd.Parameters("?A1").Value = row!A1
					cmd.Parameters("?A2").Value = row!A2
					cmd.Parameters("?A3").Value = row!A3
					cmd.Parameters("?A4").Value = row!A4
					cmd.Parameters("?A5").Value = row!A5
					cmd.Parameters("?A6").Value = row!A6
					cmd.Parameters("?ID").Value = row!ID
					cmd.Parameters("?top").Value = row!top
					cmd.Parameters("?H3").Value = row!H3
					cmd.Parameters("?H4").Value = row!H4
					cmd.Parameters("?H5").Value = row!H5
					cmd.Parameters("?H6").Value = row!H6
					cmd.Parameters("?Rde").Value = row!Rde
					cmd.Parameters("?Nr").Value = row!Nr
					cmd.ExecuteNonQuery()
				Next
				o += 1
				Application.DoEvents()
			Next o
		Catch sqlExc As SystemException
			MessageBox.Show(sqlExc.ToString, "SQL Exception Error!", _
			MessageBoxButtons.OK, MessageBoxIcon.Error)
		Finally
			Erase k
			conn.Close()
		End Try
 
Moin Alfred,

vielleicht verwirrst Du den Compile dadurch, dass Du die Parameter "....?Z1, ?Z2, ?Z3, ?Z4, ?Z5, ?Z6," vollmundig ankündigst und dann (sozusagen wie ein Hartmut Mehdorn) ohne die Stimme zu erheben eine Zeile später die Parameter "cmd.Parameters.Add("?A1"[ ?A2, A3, A4..], MySqlDbType.Int16) " setzt.
So als hättest Du das doch schon immer getan...

Compiler haben da ein etwas besseres Gedächtnis als deutsche WählerInnen und zicken da schon mal rum..

Vermutet
Biber
 
Hi,
Deine Kritik ist richtig! Es handelt sich aber lediglich um einen Übertragungsfehler. Im Original sind alle Parameter auf Z abgestellt.
Ps.:
Deiner 'Vermutung' im letzten Satz muss ich energisch widersprechen!
Dieses Problem haben nicht nur die Deutschen. ;)
Herzliche Grüße
 
Moin Alfred,

weitere begründete Vermutung für das Herumzicken des Compilers:
Du vermischt unzulässig die Syntax
> INSERT Into Tab( feld1, feld2, FeldN) VALUES ( val1, val2, ValN)
== => zum Einfügen von je 1 Satz

-- mit der Syntax --

> INSERT INTO TAB (feld1, feld2, FeldN) SELECT a, b, c FROM assaTab
---->Massen-Insert eines Resultsets

--> die zweite Syntax brauchst Du , und dafür muss in Deinem Statement die Aufzählung "VALUES ( ?vonPontius,.....?bisPilatus)" ersatzlos entfernt werden.

[OT]
P.S. Bezüglich Wahlvolk-Alzheimer in A und D: Na ja, auch bei den Franzosen kann sich keiner daran erinnern, Sarkozy gewählt, gewollt oder überhaupt gekannt zu haben...
[/OT]
 
Hi, danke für den Tip!
Ich denke, dass wir (genaugenommen Du) des Rätsel's Spur näher gekommen sind(bist). Zumindest habe ich die NullReferenceExeption wegbekommen.
Ich habe
a) die Parameter hinausgeschmissen und ebenso
b) die DataRow.
Geblieben ist:
Code:
		Dim SuchWert As String
		Dim com3 As New MySqlCommand(("SELECT * FROM tab2"), conn)
		Try
			conn.Open()
			For o = 1 To lMax
				SuchWert = k(CInt(0 + (o - 1)))
				Dim cmd As MySqlCommand
				'//
				'INSERT INTO tbl_temp2 (fld_id)	'//aus Referenzhandbuch!
				'Select tbl_temp1.fld_order_id
				'FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
				'//
				cmd = New MySqlCommand("INSERT INTO tab2(lID) " & _
				"SELECT * FROM tab1 ORDER BY lID " & _
				"WHERE Rde = '" & SuchWert & "'", conn)				cmd.ExecuteNonQuery()
				Application.DoEvents()
				'Next
				o += 1
			Next o
		Catch sqlExc As SystemException
			MessageBox.Show(sqlExc.ToString, "SQL Exception Error!", _
			MessageBoxButtons.OK, MessageBoxIcon.Error)
		Finally
			Erase k
			conn.Close()
		End Try
Jetzt gibt es nur mehr die Fehlermeldung: ....right syntax to use near 'WHERE Rde = '7'' at line 1
Die Zahl 7 = Suchwert und ist richtig wiedergegeben.
Ich sage nur: Es ist schön langsam zu verzweifeln...
Im übrigen glaube ich aufgrund meiner Lebenserfahrung nicht, dass die Menschheit zu 'belehren' ist, wie die 'Zwangsmissionierungen' von Links und Rechts in der Vergangenheit zeigten. War immer mit sehr viel Leid verbunden und hat letztendlich nichts gebracht. Man kann - um am Leben nicht zu verzweifeln - , sich nur in den Lehnstuhl setzen, die Dinge aus der Ferne betrachten und versuchen, seine Kinder zu kritischen Menschen zu erziehen. Da aber die statistische Mehrheit 'Beratungsresistent' ist, ist auch dieses Rezept für die Allgemeinheit kaum von Erfolg gekrönt.
Herzliche Grüße
 
Moin Alfred,

nun, wo das Statement ja schon richtig übersichtlich aussieht, lässt sich ja erkennen, dass das "ORDER BY IID" an unerlaubter Stelle (Syntax/Reihenfolge von WHERE und ORDER) steht und ohnehin ohne jeglichen sittlichen Nährwert ist.
Lass es einfach weg. Ersatzlos.Sollte den Fehler beheben.

[OT]
Im übrigen glaube ich aufgrund meiner Lebenserfahrung nicht, dass die Menschheit zu 'belehren' ist, ....
Hmmja, aber wirft aber mehr Fragen auf als es beantwortet...
Die vordergründige Frage ist ja, ob sich die Menschheit von irgendjemand "belehren" lässt - sei es zwangsweise oder durch Übernahme der "besseren" Argumente dieses Jemands. Hier allerdings würde ich ja ketzerisch argumentieren: Je UNkritischer die Menschen (erzogen worden) sind, desto eher würden sie wohl die Meinungen und Argumente anderer übernehmen.
Also solltest Du doch im Interesse der Menschheit eher Deine Kinder zu UNkritischen Bürgern erziehen... desto empfänglicher sind sie für Belehrungen. *lach*
[/OT]

Herzlich Grüße zurück
Biber
 
Hi,
vorweg: Es funktioniert!
JEDOCH erst nach einigen Try/Error-Anläufen, da ich weder die Vorbildung, noch die Zeit für mein Hobby habe. Quasi im 'Spazierengehen' geht`s auch nicht! Grundlegender Fehler war, dass die Quell- und Zieltabelle nicht ident waren. Die Zieltabelle darf auch kein Zählfeld haben (?). Ist dies der Fall, bekomme ich die Fehlermeldung: ...Column count doesn't match value count at row 1.
Ich war immer der Meinung( bzw. hab das irgendwo gelesen), dass VbExp.+Mysql nur Tabellen verarbeiten kann, die ein Zählfeld aufweisen. Stimmt das?
Wenn nicht, dann könnte ich mir einigen Aufwand ersparen. Meine Tabellen haben nicht mehr als einige 100ert Einträge. Die Db selbst ist nicht einmal 1MB groß.
Nun der richtige Abschnitt:
Code:
		Dim SuchWert As String
		Dim com4 As New MySqlCommand(("SELECT * FROM tab2"), conn)
		Try
			conn.Open()
			For o = 1 To lMax
				SuchWert = k(CInt(0 + (o - 1)))
				Dim cmd As MySqlCommand
				cmd = New MySqlCommand("INSERT INTO tab2 " & _
				"SELECT * FROM tab1 WHERE Rde='" & SuchWert & "'", conn)
				cmd.ExecuteNonQuery()
			Next o
		Catch sqlExc As SystemException
			MessageBox.Show(sqlExc.ToString, "SQL Exception Error!", _
			MessageBoxButtons.OK, MessageBoxIcon.Error)
		Finally
			Erase k
			conn.Close()
		End Try
Übrigens, Deine (Erziehungs-)Idee gefällt mir!
Was mir darüber hinaus auffällt, ist die Tatsache, dass die Menschheit zwar technische Erfahrungen annimmt, aber keine sozialen Erfahrungen. Es wird keinem Menschen einfallen, ovale Räder für sein Fahrzeug zu ordern, ist aber kritiklos gegenüber die Dummheiten psydoalternativer 'Vordenker'. Die Menschheit durchlebte die Ideale der 'Pariser Komune' (der erfolglose Versuch Linkslinker Traumdeuter - zu dieser Zeit gab es noch nicht die Unterscheidung zwischen Links und Rechts) bis hin zu den Menschenrechtsverbrechern der jüngeren und jüngsten Geschichte und niemand lernt daraus. Daraus könnte man doch den Schluß ziehen, dass die Alten unähig sind, ihre Erfahrungen weiter zu geben, und/oder die Jungen so unfähig sind, Erfahrungen anzunehmen.
Herzliche Grüße, und wir wollen doch nicht die Geduld des Forumbetreibers über Gebühr strapazieren.
 

Neue Beiträge

Zurück