Laden...

Probleme mit DataAdapter und INSERT

Erstellt von formatter vor 17 Jahren Letzter Beitrag vor 17 Jahren 8.075 Views
F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren
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

S
8.746 Beiträge seit 2005
vor 17 Jahren

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.

S
223 Beiträge seit 2006
vor 17 Jahren

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?

S
8.746 Beiträge seit 2005
vor 17 Jahren

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

F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren
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????

S
223 Beiträge seit 2006
vor 17 Jahren

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...

B
1.529 Beiträge seit 2006
vor 17 Jahren

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

F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren

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...

F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren
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??

S
8.746 Beiträge seit 2005
vor 17 Jahren

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

F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren

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

S
8.746 Beiträge seit 2005
vor 17 Jahren

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

Hast du mal einen Nicht-Custom-DataAdapter probiert?

563 Beiträge seit 2004
vor 17 Jahren

AcceptChanges wird implizit in Update() aufgerufen!

.unreal

F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren

...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.

F
formatter Themenstarter:in
59 Beiträge seit 2006
vor 17 Jahren

...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 ??