Laden...

Forenbeiträge von BerndFfm Ingesamt 3.825 Beiträge

16.02.2006 - 12:28 Uhr

Hi FZelle,

ich hab das mal so programmiert wie von dir vorgeschlagen :

Ohne ref vor dem Dataset erhalte ich nach dem Aufruf von "DatensatzLesen" kein gefülltes Dataset zurück, es ist leer. Ich kann also auf die gelesenen Daten nicht zugreifen.

Mit ref erhalte ich die Fehlermeldung '2-Argument: kann nicht von "ref NewDataSet" in "ref System.Data.DataSet" konvertiert werden.'

Klappt leider nicht 😦

Grüße Bernd

16.02.2006 - 09:50 Uhr

Meine Idee geht leider doch nicht, es kommt folgender Fehler :

Das Objekt des Typs System.Data.DataRow kann nicht in Typ adRow umgewandelt werden.

Also doch mit nicht typisierten Datasets arbeiten, oder ?

Grüße Bernd

16.02.2006 - 09:19 Uhr

Ich hab da mal so ne Idee : Man könnte ja auch typisierte und nicht typisierte Datasets mischen. Bei denn allgemeinen Operationen nimmt man nicht typisierte und wenn man auf die einzelnen Spalten zugreifen will nimmt man eine typisierte Zeile :


NewDataSet.adRow ad = (NewDataSet.adRow) ds.Tables["Adressen"].Rows[0];
string name = ad.Name;

Hab die obigen Zeilen nicht getestet, müssten aber funktionieren.

Grüße Bernd

16.02.2006 - 09:12 Uhr

lowrider : BackgoundWorker gibt es erst in VS 2005.

Threads und Application.DoEvents() gibt es natürlich schon in VS 2003.

Grüße Bernd

15.02.2006 - 21:55 Uhr

Ohne Select-Kommando geht nicht.

Du kannst aber ein Select-Kommando nehmen, das keine Datensätze findet.

Beispiel : select * from Adressen where Postleitzahl = -99999

Grüße Bernd

15.02.2006 - 21:39 Uhr

Hallo,

bisher habe ich die meisten Programme mit untypisierten Datasets geschrieben. Ich möchte nun typisierte Datasets verwenden, da diese einige Vorteile bieten :

  • Typenfehler schon während der Übersetzung
  • Anzeige der Spaltennamen in der Intellisense
  • einfachere Schreibweise

Meine erste Frage : Wie erstelle ich die typisierten Datasets am besten ?
Per Wizard oder per Befehl "WriteXmlSchema" und Aufruf von XSD.EXE ?
Gibt es unter Visual Studio 2005 noch andere Möglichkeiten ?
Hinweis : Ich arbeite nicht gerne mit Wizards, lieber tippe ich Code und versuche den zu verstehen.

Zweite Frage :
Ich habe einige Routinen die unabhängig von der Tabelle Operationen ausführen. Wie kann ich diese so umschreiben dass sie mit typisierten Datasets arbeiten ?

Mit untypisierten Datasets :


SqlConnection conn = null;
DataSet ds = null;
string sqlstr = "SELECT * FROM Adressen WHERE Adressnummer = 10000";

DatensatzLesen("Adressen", ref conn, ref ds, sqlstr);

string name = (string) ds.Tables["Adressen"].Rows[0]["Name"];

VerbindungSchliessen(ref conn);

Wie sieht das Ganze nun für typisierte Datasets aus ?
Die Funktionen sollen natürlich mit jeder Tabelle funktionieren.

Lohnt es sich überhaupt bei einer Applikation mit über 100 Tabellen typisierte Datasets zu verwenden ? Oder ist der Pflegeaufwand bei Tabellenänderungen zu groß ? Braucht das Programm dann mehr Resourcen ? Es werden ja immer zigtausend Zeilen Sourcecode für die typisierten Datasets erzeugt.

Grüße Bernd

15.02.2006 - 21:05 Uhr

Man kann mit einem DataAdapter und einem Dataset 2 Tabellen laden, ändern und zurückspeichern.

Aber : Der Commandbuilder kann immer nur eine Tabelle.

Also muss man vorm Speichern jeder Tabelle den SQL-Befehl ändern und den Commandbuilder neu aufrufen.

Ich hatte dieses Problem und hab lange dran geknabbert. Aber jetzt tuts :

da.SelectCommand.CommandText = "SELECT * FROM " + dat;
cb = new SqlCommandBuilder(da);
count = da.Update(ds, dat);

Die obigen drei Zeilen werden pro Tabelle aufgerufen.

Ich hoffe das hilft.

Server listen und in Listview anzeigen (nur in Dot.NET 2.0) :

lviServerliste.View = View.Details;
lviServerliste.Columns.Clear();
lviServerliste.Columns.Add("Servername", 200, HorizontalAlignment.Left);
lviServerliste.Items.Clear();
lviServerliste.Enabled = false;
ListViewItem lvItem;
SqlDataSourceEnumerator num = SqlDataSourceEnumerator.Instance;
DataTable dt = num.GetDataSources();
foreach (DataRow row in dt.Rows)
{
    lvItem = new ListViewItem(row[0].ToString());
    lviServerliste.Items.Add(lvItem);       // Items zum ListView hinzufügen 
}
lviServerliste.Enabled = true;

Wie man die Datenbanken pro Servr listet weiss ich noch nicht. Programmier Du das mal und poste es hier, ich brauche es nämlich auch.

Grüße Bernd

15.02.2006 - 09:39 Uhr

Wenn man hinter eine Firewall sitzt muss man bei FTP oft den Passiv-Mode einstellen.

Geht das auch in C# mit FtpWebRequest/FtpWebResponse ?

Grüße Bernd

08.02.2006 - 10:05 Uhr

Hi Unreal,

in meinem Fall dauert der Import eines Datensatzes nur einen Bruchteil einer Sekunde, die Applikation kann also schnell genug auf alle Ereignisse reagieren.
Der gesamte Import dauert natürlich länger, das können schon einige Stunden sein.

BackgroundWorker sind wohl einfacher zu implementieren als Threads, obwohl sie ja fast das gleiche tun.

Und man kann sie im Designer aus der Toolbox auf die Applikation ziehen 😉
Das scheint wohl wichtig zu sein.

Es gibt noch genügend Anwendungen wo die Vorgänge länger dauern oder parallel ablaufen sollen und ich mich dann doch mit Threads beschäftigen muss, z.B. Emailversand an 100 Leute gleichzeitig (Newsletter), umfangreiche Datenbankabfragen oder Dateien kopieren.

Grüße Bernd

08.02.2006 - 00:46 Uhr

Für meine Anforderung habe ich eine einfache Lösung gefunden :

Application.DoEvents();

in der Hauptschleife genügt, da ein einzelner Import recht schnell geht. Es können nur einige Tausend bis Millionen Datensätze sein.
ProgressBar und Abbruch-Button funktionieren wunderbar.

Die BackgroundWorker hab ich mit trotzdem angesehen weil ich sie für andere Sachen brauchen werde.

Grüße Bernd

07.02.2006 - 11:26 Uhr

Bei der Suche nach den genannten Suchworten hab ich festgestellt dass wohl jeder mal dieses Problem hat 😉

Ich habe 3 Beispiele zu BackgroundWorker gefunden, die werde ich mir mal anschauen und dann probieren ob ich das damit hinkriege :

http://www.stim.de/index.php?id=185

http://msdn2.microsoft.com/de-de/waw3xexc.aspx

http://msdn2.microsoft.com/de-de/ms229675(de-de,VS.80).aspx

07.02.2006 - 11:20 Uhr

Dass Leerzeichen nicht mitgezählt werden hab ich auch schon bemerkt. Also hab ich einen Punkt davor und dahinter gemacht, die Länge gemessen und dann die Länge von den 2 Punkten wieder abgezogen. Nun klappts bei mir :

zlen = e.Graphics.MeasureString("."+zl2+".",txtfont2).Width-e.Graphics.MeasureString("..",txtfont2).Width;

Grüße Bernd

07.02.2006 - 09:34 Uhr

Das hab ich befürchtet, das man da was mit Threads machen muss.

😉

Dann werde ich mich mal damit beschäftigen.

Danke für die Infos und einen schönen Tag noch,

Bernd

07.02.2006 - 09:06 Uhr

Ich starte einen Datenimport durch Klick auf einen Button. Den Fortschritt zeige ich mit einer ProgressBar an.
Beim Import wird die ProgressBar durch den Befehl ProgressBar1.Refresh(); aktualisiert.

Wenn ich nun auf das Fenster klicke oder es mal im Hintergrund war wird es nicht mehr aktualisiert und das Fenster bekommt den Zusatz "(Keine Rückmeldung)".

Wie kann ich bewirken, dass die ProgressBar auch nach Mausklicks aktualisiert wird ?

Wie kann ich bewirken dass ich den Vorgang durch Klick auf einen Button abbrechen kann ?

Wenn ich vor dem Import die Dateien leere mit einem SQL-Befehl dann dauert dass eine Weile. Kann ich in dieser Zeit auch was anzeigen bzw. Abbrechen ermöglichen ?

Fragen über Fragen 😉

Grüße Bernd

03.02.2006 - 12:33 Uhr

Hallo Vernichter,

hier ist ein Beispiel mit 2 Tabellen und 2 Datagrids mit einem Dataset. Zwar in Basic, aber das Prinzip kann man gut erkennen.

http://www.galileocomputing.de/openbook/asp/asp120005.htm#Rxxasp12901MehrereTabellenineinDataSetObjekteinlesen

Programmhans : Du weisst ich bin sparsam mit Datasets

😉

Grüße Bernd

03.02.2006 - 10:55 Uhr

Hi,

ich habs selbst rausgefunden :

Vor dem Befehl da.Update habe ich eingefügt :

cb.Dispose();
da.SelectCommand.CommandText = "SELECT * FROM "+dat;
cb = new SqlCommandBuilder(da);

Jetzt wird vor jedem Einfügen eines neues Datensatzes der Insert-String neu aufgebaut. Da dies nur im Hauptpeicher stattfindet sollte das auch schnell gehen.

Programmierhans : Da die Routine mit allen Datenbanken funktionieren soll wollte ich die Verwendung von mehreren Datasets und DataAdapters verhindern. Es können über 100 Tabellen gleichzeitig sein die da angesprochen werden.

Grüße Bernd

03.02.2006 - 10:33 Uhr

Hallo Leute,

zuerst einmal finde ich dieses Forum echt Klasse. Ich habe aus den Beiträgen schon viele Ideen schöpfen können.

Nun komme ich nicht weiter, und weder im Forum noch anderswo kann ich eine Lösung dazu finden.

Ich lade aus einer externen Datei mehrere Datensätze, die in verschiedene Tabellen gespeichert werden müssen. Da ich vorher nicht weiss welche Tabelle füge ich mehrere Tabellen dem Dataset hinzu und erzeuge eine Tabellenzeile zu der jeweiligen Tabelle :

		conn = new SqlConnection(connStr);
	ds = new DataSet();
	da = new SqlDataAdapter( sqlstr, conn);
	cb = new SqlCommandBuilder(da);
	DataRow rw = null;
	try
	{
		conn.Open();
		ds.Clear();

		da.SelectCommand.CommandText = "SELECT * FROM table1";
		ds.Tables.Add("table1");
		count = da.Fill(ds,"table1");

		da.SelectCommand.CommandText = "SELECT * FROM table2";
		//cb.RefreshSchema();
		ds.Tables.Add("table2");
		count = da.Fill(ds, "table2");

		da.SelectCommand.CommandText = "SELECT * FROM table3";
		ds.Tables.Add("table3");
		count = da.Fill(ds, "table3");
	}
	catch (Exception ex)
	{
	}
	conn.Close();
	
	while (...)
	{
		// Datensatzanfang, dat = Name der Tabelle
		rw = ds.Tables[dat].NewRow();
		
		// Felder zuordnen
		rw[fname1] = str1;
		rw[fname2] = str2;
				

		// Datensatz einfügen
		ds.Tables[dat].Rows.Add(rw);
		try
		{
			conn.Open();
			count = da.Update(ds, dat);
		}
		catch (Exception ex)
		{
			MessageBox.Show("Datenbank-Fehler : " + ex.Message);
		}
	}


Beim Ausführen des da-Update-Befehls bekomme ich die Fehlermeldung DataColumn 'dat3_spalte1' in der DataTable 'table1' für SourceColumn 'dat3_spalte1' ist nicht vorhanden"

Ich habe inzwischen festgestellt, dass es am ComandBuilder liegt, der seien Insert-Befehl nur für eine Tabelle erstellt hat.
Auch Probieren mit cb.RefreshSchema() und Anlegen von mehreren Comandbuildern hat keinen Erfolg gebracht.

An welcher Stelle muss ich denn eigentlich den Commandbuilder erstellen ?

Wie kann ich Commandbuilder für mehrere Tabellen erstellen ? Erkennt er dann welchen Insert-Befehl er benutzen muss ?

Danke für eure Bemühungen,

Grüße Bernd

02.02.2006 - 17:19 Uhr

Restzeit anzeigen :

Aus der bisher übertragen Datenmenge und der bisher verbrauchten Zeit den Zeitbedarf errechnen. Das ist einfacher Dreisatz. Das Ergebnis wird dann zum Ende hin immer genauer.

(wie im WindowsDialog)

Bist Du sicher ? In Windows stimmen die Zeitangaben nie !

😉

Grüße Bernd

02.02.2006 - 09:35 Uhr

Das finde ich gut !

Ich habe mich schon gewundert das ein Forum über C# und Dot.Net auf PHP läuft.

Ich habe auf einer meiner Seiten PHP laufen und bin froh wenn ich es durch Dot.Net ablösen kann.

Viel Erfolg mit dem neuen Forum

Bernd

24.01.2006 - 00:12 Uhr

Trial and Error :

Hab nun die DLL-Dateien in ein Verzeichnis \bin kopiert, das ich leer auf meinem Webserver gefunden habe.

Nun geht alles. Hoffe ich.

Aber ASP.NET aus PHP kann ich immer noch nicht ohne iframe aufrufen.

Grüße Bernd

23.01.2006 - 23:49 Uhr

Ich habe nun entdeckt, dass bei der Konvertierung von 1.1 nach 2.0 sich die Verzeichnisstruktur ändert und so alte und neue Programmversionen auf dem Webserver zu finden sind. Hab nun alles gelöscht und neu übertragen.

Jetzt kommen dauernd neue Fehlermeldungen.

😦

Gibt es da eine Patentlösung oder soll ich Version 1.1 wieder installieren ?

Grüße Bernd

PS.: Die aktuelle Fehlermeldung kann jeder aufrufen unter http://partyfotos.quasarshop.de/Bewerbung.aspx?bew=partygirl

23.01.2006 - 22:03 Uhr

vbprogger : Ist ja meine eigene Scriptdatei, also kann ich auch include verwenden.

Hab jetzt alles auf Dot.NET 2.0 umgestellt, jetzt laufen meine Programme nicht mehr.

Ich bekommen die Fehlermeldung :

 The type 'Eventkalender.Global' is ambiguous: it could come from assembly 'D:\ftp\partyfotos\bin\Eventkalender.DLL' or from assembly 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\2656e183\8a72f965\App_Code.szenihbf.DLL'. Please specify the assembly explicitly in the type name.

Was kann ich da tun ?

Originalfehlermeldung : http://partyfotos.quasarshop.de/Bewerbung.aspx?bew=partygirl

Achja, die Unterschiede zwischen 1.1 und 2.0 kenne ich. Nur nicht die speziellen Unterschiede bei "<form action=...>".
Zwei von meinen Portalen (siehe Signatur) laufen ja schon unter DotNetNuke 4.0.2, also unter ASP.NET 2.0.

Grüße Bernd

23.01.2006 - 16:53 Uhr

Wie geht das mit fopen ?

Welche Vorteile bringt das ?

Die Datei, die ich mit include aufrufe, wird ja von Dot.Net interpretiert. Was kann fopen mehr ?

Die Dateien sind mit Dot.Net 1.1 erstellt, ich kann sie aber auf 2.0 umstellen.
Was geht dann besser ?

Grüße Bernd

23.01.2006 - 11:34 Uhr

Hi Leute,

danke für eure Ideen.

iframe klappt bestens, mit den bekannten Nachteilen dass man die Formulatgröße fest angegen muss usw. :

http://www.partyfotos.de/modules.php?name=html_Test

Der andere Vorschlag klappt leider nicht :

Ich habe die Angabe

<form id="Form1" method="post" action="http://partyfotos.quasarshop.de/Test2.aspx" runat="server">

in die Datei Test2.aspx geschrieben. Beim Klick auf den Button wird dennoch http://www.partyfotos.de/Test2.aspx aufgerufen.
Wenn man sich den Quelltext ansieht erkennt man, das der Eintrag "Action" verschwunden ist. Dot.Net scheint den zu entfernen.

Quelltext :

<form name="Form1" method="post" action="Test2.aspx" id="Form1">

Grüße Bernd

20.01.2006 - 11:29 Uhr

Hallo erstmal,

bin neu hier und habe gleich ein kompliziertes Problem / Anforderung :

Ich betreibe ein Portal basierend auf PHPNuke (leider), das ich so auf die Schnelle nicht umstellen kann.

Einzelne Module habe ich schon in ASP.NET 2.0 programmiert.

Nun würde ich gerne ASP.NET-Module im PHP integrieren, so dass z.B. Eingabemasken im Portal erscheinen.

Beispiel für den PHP-Code :

include("header.php");
include("http://partyfotos.quasarshop.de/Test.aspx");
include("footer.php");

header.php und footer.php erzeugen das ganze Portal mit Titel und Menü usw.
In Test.aspx soll nun eine Eingabemaske sein.
PHP und ASP.NET liegen z.Zt. auf verschiedenen Rechnern.

Formular einzeln : http://partyfotos.quasarshop.de/Test.aspx

Formular im Portal integriert : http://www.partyfotos.de/modules.php?name=html_Test

Wenn ich nun ein Control wie z.B. Button klicke, dann ruft sich das Formular wieder auf, aber nicht wie gewünscht das Portal, sondern das Formular selbst.

Wie kann ich nun angeben, dass er statt /Test.aspx z.B. http://www.partyfotos.de/modules.php?name=html_Test aufruft ?

Parameter die modules.php übergeben bekommt wie Session-ID kann ich an Test.aspx weitergeben.

Grüße Bernd