Laden...

Probleme mit DataAdapter und INSERT

Letzter Beitrag vor 17 Jahren 15 Posts 8.091 Views
Probleme mit DataAdapter und INSERT

Hallo Leute,

bekommen immer die Fehlermeldung:

Type of value has a mismatch with column typeCouldn't store <16.08.2006 00:00:00> in Date Column. Expected type is MySqlDateTime.

Wie kann ich den Typ System.DateTime in MySqlDateTime konvertieren? Falls möglich kleinen Code.

Danke,
Formatter

Füge Parameter grundsätzlich via Parameters.Add() in SQL-Commands ein. Da bist du nicht nur das Konvertierungsproblem los (bei dir eher ein Lokalisierungsproblem), sondern zugleich auch gegen SQL Injection gewappnet.

kann mir das mal jmd erklären, warum es hilft, das ganze per parameters.add() einzufügen bzw. es bleibt doch immer noch der selbe string, warum bin ich da nun gegen sql injection geschützt? wird der automatisch "geunescaped" wenn man parameters.add() nutzt, oder was ist da anders?

Original von srynoname
warum bin ich da nun gegen sql injection geschützt? wird der automatisch "geunescaped" wenn man parameters.add() nutzt, oder was ist da anders?

So in etwa:

http://msdn2.microsoft.com/de-de/library/ms161953.aspx

Index and length must refer to a location within the string

was bedeutet:

Ausnahme System.ArgumentOutOfRangeException wurde im ausgeführten Programm ausgelöst:
Index and length must refer to a location within the string.

und wie kann ich es vermeiden????

du benutzt ne string funktion wie substring die z.b. auf zeichen x+1 zugreift, aber dein string hat nur x zeichen, somit ist ein zugriff auf x+1 nicht möglich...

So etwas passiert häufig bei String.Substring(). Bedenke, dass es diese Methode in zwei Überladungen gibt...

leider beisse ich mir immer noch die zähne an der aktualisierung meiner datenbank aus. immer der oben genannte fehler:

Ausnahme System.ArgumentOutOfRangeException wurde im ausgeführten Programm ausgelöst:

Index and length must refer to a location within the string.

UpdatedRowStatusErrors()
UpdatedRowStatus()
Update()
UpdateFromDataTable()
Update()
Main() - c:\Dokumente und Einstellungen\noname\Eigene Dateien\SharpDevelop Projects\TestDb\Main.cs:41,4

hier mal der gesamte code:


using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;


namespace TestDb
{
	public class MainClass
	{
	
		public static void Main(string[] args)
		{
			string myConnectionString = "SERVER=localhost;UID=root;PWD=;DATABASE=test;Allow Zero Datetime=True;";
			
			DatabaseClient myClientDb = new DatabaseClient(myConnectionString);			
			myClientDb.ConnectDatabase();
			
			MySqlDataAdapter myDataAdapter = myClientDb.CreateCustomerAdapter();
			
			DataSet myDs = new DataSet();
			myDataAdapter.Fill(myDs, "Test");
			
			DataTable myDt = myDs.Tables[0];														
			
			DataRow newRow = myDt.NewRow();
			newRow["id"] = 2;
			newRow["wert"] = 10;
			myDt.Rows.Add(newRow);
			
			myDataAdapter.Update(myDs, "Test");
			
			myClientDb.DisconnectDatabase();
			Console.WriteLine("Zum Beenden [Enter] drücken...");
			Console.ReadLine();

		}
	}
	public class DatabaseClient
	{
		private MySql.Data.MySqlClient.MySqlConnection myConnection;
			
		private bool LoggedInDatabase = false;
		
		private string myConnectionString;					
		public string ConnectionString		
		{
			get
			{
				return myConnectionString;
			}
			set
			{
				myConnectionString = value;
			}
		}
		public DatabaseClient() : this("")						
		{
		}
		public DatabaseClient (string ConnectionString)			
		{
			this.myConnectionString = ConnectionString;
		}
		public void ConnectDatabase()
		{
			Console.WriteLine("Verbindungsaufbau mit MySQL Server...");
			try	{
				myConnection = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString);
				myConnection.Open();
				LoggedInDatabase = true;
				Console.WriteLine("Verbindungsaufbau mit MySQL Server erfolgreich.");
			}
			catch (MySql.Data.MySqlClient.MySqlException ex)	{
				switch (ex.Number)	{
					case 0:
						Console.WriteLine("Fehler beim Verbindungsaufbau mit MySQL Server. Administrator kontaktieren.");
						break;
					case 1045:
						Console.WriteLine("Fehler beim Verbindungsaufbau mit MySQL Server. User/Passwort falsch.");
						break;
				}
			}
		}
		public void DisconnectDatabase()
		{
			if ( LoggedInDatabase)	{
				try {
					
					try	{
						myConnection.Close();					
						Console.WriteLine("Trennen der MySQL Server Verbindung.");
					}
					catch (Exception ex) {
						Console.WriteLine("Fehler beim Trennen der MySql Server Verbindung. Ausnahme:");
						Console.WriteLine(ex.Message);
					}
					myConnection = null;
				}
				catch (Exception ex) {
					Console.WriteLine("Fehler beim Ablauf von Methode DisconnectDatabase. Ausnahme:");
					Console.WriteLine(ex.Message);
				}
			}
			else	{
				Console.WriteLine("Keine MySQL Server Verbindung vorhanden.");
			}
		}
		public MySqlDataAdapter CreateCustomerAdapter()
		{
			MySqlDataAdapter da = new MySqlDataAdapter();
			da.MissingMappingAction = MissingMappingAction.Passthrough;
			da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
			MySqlCommand cmd;
 		
  			cmd = new MySqlCommand("SELECT * FROM test", myConnection);
 			da.SelectCommand = cmd;
  			
  			cmd = new MySqlCommand("INSERT INTO test (id, wert) VALUES (?id, ?wert)", myConnection);
 			cmd.Parameters.Add("?id", MySqlDbType.VarChar, 12, "id" );
  			cmd.Parameters.Add("?wert", MySqlDbType.VarChar, 12, "wert" );
 			da.InsertCommand = cmd;  
 			
			return da;
		}
	}
}

die datenbank


mysql> describe test;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI |         |       |
| wert  | int(11) | NO   |     |         |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql>

ich habe aufgegeben, wenn keiner von euch helfen kann kommt "ExecuteNonQuery" zum einsatz. möchte ich allerdings vermeiden...

Probleme mit DataAdapter und INSERT

Möchte mein Problem nochmal unter anderem Thema aufgreifen...wie bekommen ich das geänderte DataSet wieder in meine Datenbank??

Auf den ersten Blick würde ich sagen: DataSet.AcceptChanges() fehlt.

Wenn ich nach dem Hinzufügen der neuen Zeile "AcceptChanges" aufrufe wechselt der Zeilenstatus von "Added" auf "Unchanged". Beim Update Kommande passiert daher nichts...

Der Tipp war auch Blödsinn. Wenn dann danach.

Hast du mal einen Nicht-Custom-DataAdapter probiert?

AcceptChanges wird implizit in Update() aufgerufen!

.unreal

...bis jetzt habe ich nur custom data adapter probiert. Benutze SharpDevelop und habe noch nicht nach einem Code Generator gesucht...werde ich mal versuchen.

Ich verstehe nur nicht warum bei meinem Code ständig die Fehlermeldung:

Ausnahme System.ArgumentOutOfRangeException wurde im ausgeführten Programm ausgelöst:
Index and length must refer to a location within the string.

kommt. Ist den an


DataRow newRow = myDt.NewRow();
newRow["id"] = 2;
newRow["wert"] = 10;
myDt.Rows.Add(newRow);

was falsch??? Wenn ich mir den DataSet- Inhalt vor dem Update ausgeben lassen meckert er nicht.

...habe in SharpDevelop leider nichts zu Automatischer Codegenerierung für meinen Fall gefunden.

Nichts desto trotz verstehe ich diese Fehlermeldung nicht bzw. warum ich sie bekomme.Wenn ich meinen Code mit MySql bzw. C# Beispielcode vergleiche sollte es eigentlich klappen. Das Ausgeben des veränderten DataSets klappt ja auch noch einwandfrei. Warum das UPDATE nicht ??