Laden...
D
Druid myCSharp.de - Member
Schüler Essen Dabei seit 08.10.2005 155 Beiträge
Benutzerbeschreibung

Forenbeiträge von Druid Ingesamt 155 Beiträge

10.01.2006 - 11:43 Uhr

Also bei größeren Datenmenge würde ich dennoch auf den Datenbankserver zurückgreifen. Welches DBMS ist es denn?
Wenn es sich um den MS SQL Server 2000/2005 handelt kannst du sogar per T-SQL eine Tabellenvariable verwenden.

Aber selbst temporäre Tabellen sind in der Regel schneller als ADO.NET. Teste mal was am besten für dich ist. Wenn die Datenmenge nicht zu groß wird (sagen wir mal < 20MB) dann kannste ruhig .NET nehmen...

09.01.2006 - 19:37 Uhr

Ganz doll leider 😉 musst du auf COM zurückgreifen.
Du musst das Microsoft Access Object Library (aktuelle Version 11 glaube ich) einbinden. Mein Source Code verwendet das Microsoft Access Object Library 9.0 (Office 2000).
Die DLL ist standartmäßig auf den folgenden Pfad installiert:
C:\Programme\Microsoft Office\Office\MSACC9.OLB
Wobei der Dateiname abweichen kann.


		public static string GetModule(string Modulname)
		{
			try
			{
				System.Text.StringBuilder retval = 
					new System.Text.StringBuilder();
				Access.ApplicationClass app = new Access.ApplicationClass();
				app.OpenCurrentDatabase("C:\\mydb.mdb", false);
				foreach(Access.Module mdl in app.Modules)
				{
					if(mdl.Name == Modulname)
					{
						for(int i=0; i < mdl.CountOfLines; i++)
						{
							retval.Append(mdl.get_Lines(i, mdl.CountOfLines));
						}
						return retval.ToString();
					}
				}
				return null;
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
				return null;
			}
		}

Ungetestet! Du kannst auch das Docmd Objekt ansprechen in einer Application.

Bitte beachten: Die DLL musste natürlich auf den Client mitnehmen!

09.01.2006 - 18:45 Uhr

Habs zwar noch nie mit .AllowDBNull probiert aber eigentlich legt man doch das Schema in der Datenbank über SQL Scripts fest?!

Weiterhin übernimmt .NET doch auch die Schema Informationen wenn du nicht grade was spezielles machst.

Für (fast) alle Datenbank Systeme (DBMS) gibts doch außerdem Klassen, damit die Integration reibungslos geht (auch Connectors genannt).

DBMS die auf jeden Fall Connectors haben:

SQL Server 2000 (1.1 vorinstalliert)
SQL Server 2005 (2.0 vorinstalliert)
Oracle (1.1 && 2.0 vorinstalliert, dennoch sollte man den mitgelieferten von Oracle besser nehmen).
Firebird / Interbase (bitte auf Website von FB schaun!)
MySQL (auch hier bei der Website schaun (.NET Connector 1.0))

Ausschließlich MS Access nutzt nur OLEDB.

Gruß Christian

09.01.2006 - 18:39 Uhr

Die beste Möglichkeit ist natürlich wenn du direkt die .NET Klassen von MySQL nimmst:

http://dev.mysql.com/downloads/connector/net/1.0.html
[Datum 9.1.2006]

Dann hast du die optimale Performance, keine Probleme mit Datentypen, etc.

Du musst nur in deiner IDE die entsprechende DLL einbinden (ist eine .NET DLL keine COM DLL).
Bei Bedarf: Kannst auch noch selber die MySQL Klassen erweitern (sind ja Open Source).

Generell solltest du aber mit dem Angebot auskommen.
Schade finde ich nur dass MySQL keinen ConnectionstringBuilder mitbringt und man sich den selber bauen muss.
Ich habe mir für MySQL, Oracle, SQL Server 2000 und MS Access eine eigene Connectionstringbuilder DLL zusammengebaut und gebe die auch gerne weiter (Kostenlos und kompletter Code natürlich [christiandernehl@web.de mailen]).
Aber ich denke das schweift jetzt doch zu stark von Thema ab.

Also in der Hilfe von MySQL findest du auch noch zum Connector viele Infos. Weiterhin kann ich die Helper Klasse im Namespace empfehlen, die macht die ADO.NET Programmierung noch einfacher!

Gruß Christian

09.01.2006 - 18:27 Uhr

Hallo!

Warum machst du dass dann nicht direkt per SQL?

DataAdapter da = new DataAdapter("... dein SQL", cn);
DataTable dt = new DataTable();
da.Fill(dt);

So hast du alle zusammen.

Wenn's aber dringend aus irgendeinem Grund in .NET sein muss, was natürlich deutlich langsamer ist, hier:


		public DataTable Union(DataTable[] Tables)
		{
			DataTable retval = new DataTable("UnionTable");
			foreach(DataTable tbl in Tables)
			{
				if(retval.Columns.IndexOf("ID") != -1)
				{
					retval.Columns.Add("ID", System.Type.GetType("System.Int32"));
					retval.PrimaryKey = new DataColumn[1] {retval.Columns["ID"]};
				}
				retval.Columns.Add(tbl.TableName + "_" + tbl.Columns[1].ColumnName, tbl.Columns[1].DataType);
				foreach(DataRow entry in tbl.Rows)
				{
					int ID = int.Parse((entry["ID"]));
					DataRow foundrow = retval.Rows.Find(ID);
					if(foundrow == null)
					{
						//neue datarow anlegen -> eintrag nicht in liste
						DataRow newrow = retval.NewRow();
						newrow["ID"] = ID;
						newrow[tbl.Columns[1].ColumnName] = entry[1];
						retval.Rows.Add(newrow);
					}
					else
					{
						foundrow[tbl.Columns[1].ColumnName] = entry[1];
					}
				}
                    
			}
			return retval;
		}


ungetestet!

09.01.2006 - 09:24 Uhr

Also irgendwie wiedersprichst du dich selbst.

Dein SQL Statement bildet eine Relation.
Dein Anliegen ist aber "zusammenfassen".
Bei SQL würde mal fürs zusammenfassen aber einen UNION Befehl nehmen oder etwa nicht?

Dann nehme ich mal an dass dein SQL Beispiel nicht existent ist.

Sind die Tabellen auch genauso in der Datenbank? Wenn ja nimm den UNION Befehl.

Wenn nicht dann musste wirklich Hand anlegen.
Du kannst eine neue DataTable erststellen nach dem Schema (Clone).
Dann kannst du Zeile (Datensatz) für Zeile importieren (ImportRow).
Das machst du dann mit beiden Tabellen (DataTables).

Gruß Christian

08.01.2006 - 15:26 Uhr

Ich denke es sind die wichtigen Daten gemeint die in einer neuen Klasse <serializable()> zusammengefasst wurden, anders kann ich es mir nicht vorstellen...

08.01.2006 - 15:24 Uhr

Also hab's zwar noch nie gemacht aber du hast da mehrere Möglichkeiten:

Wenn MS Excel 2003+ kannst du auch XML als Zwischenmedium wählen.

Generell: Versuchs mal über den Datenbankprovider:
Insert Into [Sheet1$] VALUES(0,0,0,0);
Sonst auch mal über das MS Object Library versuchen (ich glaube aktuelle Version ist 11?). Aber damit gehts auf jeden Fall, nur ist eben die Excel DLL vorrausgesetzt.

04.01.2006 - 19:57 Uhr

Vielleicht ganz anders?
Du kannst sogar Variablen nehmen, dass müsste alles abdecken
(sämtliche Formen von Dateien (txt, etc.), datenbanken, etc.)

04.01.2006 - 16:18 Uhr

Also:

Erstmal zu 1.



Imports System.Data;
Imports System.Data.OleDb;
//.....
//Festlegen des Connectionstrings in der Verbindung cn
//cn kann geschlossen bleiben
OleDbDataAdapter da = new OleDbDataAdapter(cn);
DataTable dt = new DataTable("mytable");
DataRow dr;
DataColumn dc;
//Daten laden
da.Fill(dt);
//Daten ausgeben
//Rows -> Eine Collection von DataRows (Datensätzen)
//Row[COLUMNNAME oder INDEX] gibt den Wert eines
//speziellen Feldes an.
foreach (dr in dt.Rows())
{
     foreach(dc in dt.Columns())
     {
           Debug.WriteLine(dr[dc.Columnname].ToString());
      }
}


-> Hoffe habe keine Syntaxfehler, bin VB Programmierer normalerweise 😉

Zu 2.

Schau dir mal die Relations an im DataSet Objekt.

Gruß Christian

03.01.2006 - 20:32 Uhr

Also erstmal kannst du (leider) nur typisierte DataSets nehmen. Falls du es noch nicht weißt: Typisierte DataSets sind bereits vordefinierte DataSets, die du im Editor von VS festlegen kannst.

Dann kannst du die DataSource mit

[reportname].SetDataSource([datasetname])

02.01.2006 - 19:30 Uhr

Du kannst nicht "NewRow" und importRow gleichzeitig verwenden!!!
Entweder NewRow und dt.Rows.Add(NEWROW) oder dt.Rows.ImportRow(ROW AUS ANDERER TABELLE MIT GLEICHEM SCHEMA).

02.01.2006 - 19:28 Uhr

Ich würde anstelle Clear eher ein Reset vorschlagen, dann biste auf der sicheren seite.

31.12.2005 - 01:11 Uhr

LOL ja danke

stimmt, ich war einfach zu dumm.
Frei nach dem Motto für jeden Button einen Handler habe ich mehrere Handler auf ButtonClicked gesetzt!

Daher wurde auch mehrfach die Messagebox angezeigt!

Danke für die Aufklärung, hätte beinahe einen Bug Report an MS geschickt.

30.12.2005 - 22:17 Uhr

Hallo!

So, erstmal muss ich Mircosoft anklagen wegen der Toolbar. (Nutze VS 2003 Prof. + Windows XP Prof.)

Facts: Ich habe ein MDI Formular mit einer dynamisch hinzugefügten Toolbar (per hand, nicht durch den Editor mithilfe einer Imagelist).

Fehler:

Ich möchte ein weiteres Formular mit ShowDialog(this) öffnen. Wenn ich es wieder schließe behandelt der Handler wieder das ButtonClicked Event und und die Form wird weiter angezeigt (immer wieder eine neue Instanz).

Ich möchte eventuelle eine Messagebox anzeigen, hier das gleiche Prob. wie oben.

10.12.2005 - 14:43 Uhr

So einfach ist dass nicht und übrigens auch nicht üblich.
Bei Aktionsabfragen gibt man normalerweise die Anzahl der betroffenden Zeilen wieder (das macht auch der ExecuteNonQuery).
Du kannst entweder einen TimeStamp verwenden und so die geänderten Datensätze überprüfen oder du wirst viel Spass beim Suchen mit T-SQL haben, denn hier gäbe es die Möglichkeit Werte zurückzugeben. Versuch mal das über eine Tabellenvariable zu regeln.

Übrigens:
Toll ist sicher auch noch eine Multiline Textbox bzw. eine Richtextbox die bei Änderung aktualisiert wird und alle SQL Keyword z.B. blau und fett markiert.

10.12.2005 - 01:27 Uhr

Original von norman_timo
Hallo Alex71!

Das Problem an der ganzen Sache ist, dass Du eine direkte Socketkommunikation zwischen Deiner .NET ADO Schnittstelle und Deiner Datenbank hast.

Willst Du jetzt messen wieviel Bytes über den Port gejagt werden, müsstest Du den selben Port benutzen, und das geht nicht.

Also wenn Du unbedingt einen Bytezähler auf Port Ebene programmieren möchtest, dann musst Du eine Art MAN-IN-THE-MIDDLE spielen.

Das heißt, Du stellst einen Eingangsport zur verfügung, und simulierst, Du wärst die Datenbank. Deine Applikation versucht bei einer DB-Connection Dich über Deinen gewählten Port zu erreichen. Dann machst Du eine Verbindung zu Deiner echten Datenbank auf (über einen separaten Port). Dann kannst Du alle empfangenen Bytes der .NET Applikation zählen und direkt über den anderen Port an die Datenbank schicken. Dabei musst Du ja nicht wissen, wie der Inhalt dazu aussieht, aber zählen kann man damit.

Antworten der DB schickst Du dann analog entsprechend anders herum.

Damit hättest Du einen Zähler gebaut. Um damit dann auch Events zu feuern, das sollte dann wieder einfach funktionieren...

Ciao
Norman-Timo

Dazu: Wenn der Datentransfer sehr groß ist, kann das aber zur erheblichen Performanceverlusten führen... ich denke da nicht in Bereichen von 10KB...

10.12.2005 - 01:23 Uhr

Also zum Fillen:

Woher weißt du eigentlich wie viele Datensätze aus der Datenbank kommen (SELECT COUNT(*))?

Ne, ich kann ja verstehen, wenn das Projekt UNBEDINGT eine Progressbar beim füllen braucht, aber reicht nicht einfache eine Animation? Das ist mit 2 Fäden leichter zu bewerkstelligen, als MT und Events zusammen zu klatschen. Da verliert man sowieso sehr schnell den Überblick.

10.12.2005 - 01:17 Uhr

Bei kleinen Datenmengen kann man über den Performanceverlust wegsehen, aber bei großen Dateien nicht. Der SQL Server 2000 und 2005 habe XML Unterstützung. Da musste dich mal schlau machen.

10.12.2005 - 01:16 Uhr

System.Text.StringBuilder sbui = new System.Text.StringBuilder();
sbui.Append("[Zeit_V]>#2005/12/05 00:00:00#");
sbui.Append(" AND ");
sbui.Append("[Zeit_B]<#2005/12/10 00:00:00#");
sbui.Append(" AND ");
sbui.Append("FriseurNr = /'");
sbui.Append(strFrNr);
sbui.Append("/'");

-- Bin (relativ) neu in C#. Kenne .NET aber schon lange.
Ich kann mir nur zu gut vorstellen, dass (') ein Escapezeichen
erfordert. Tipp: Stringbuilder machen die Sache übersichtlicher.

04.12.2005 - 21:12 Uhr

Du kannst an das Steuerelement die Daten binden.

03.12.2005 - 00:13 Uhr

Es mag ja sein das MS Access vorgegeben ist, aber bei Client/Server würde ich doch eher die kostenlose MSDE nehmen.
Nur eine Alternative nebenbei.

02.12.2005 - 19:18 Uhr

Das mit dem t_ ist aber irgendwie doch immer noch standart. Ich mache es auch immer noch. Naja ist wohl Geschmackssache.

27.11.2005 - 13:32 Uhr

Gibt der Select einen Primärschlüssel zurück, sonst kannste GetInsertCommand vergessen.

Ich gehe mal davon aus, dass du mehr als einen Datensatz einfügen will, sonst kann man sich seinen eigenen Insert Command schön mit Parametern bilden.

27.11.2005 - 13:30 Uhr

Sonst auch in einer XML Datei zwischenspeichern (ds.WriteXml)?

27.11.2005 - 13:28 Uhr

Angenommen du hast eine Tabelle mit 3 Spalten/Feldern und Feld 1 ist der Primärschlüssel (ID)

ID Vorname Nachname




DataRow dr = dataSet41.Tables("Benutzer").Rows.Find(myID);
Console.WriteLine(dr != DbNull.Value ? dr["Vorname"].ToString() : "Fehler" ); 

//C# ist leider nur meine 2t Sprache, deshalb können eventuell Syntaxfehler vorliegen

Wenn das nicht das gewünschte Ergebnis bringen sollte, musst du dein Problem noch mal genauer beschreiben.

27.11.2005 - 13:23 Uhr

Schau mal nach den Ländereinstellungen. Wahrscheinlich musst du mal ausnahmsweise ein "," verwenden. Versuch mal.

23.11.2005 - 15:44 Uhr

Nimm doch dann einen Pivot Table?

23.11.2005 - 14:49 Uhr

Warum über Crystal? Es geht doch viel einfacher direkt?

http://www.codeproject.com/database/excel_odbc_write.asp

22.11.2005 - 23:14 Uhr

Ich habe von 4.1 auf 5 geupdated und es funktioniert ganz ohne Probleme.
Connectionstring vielleicht falsch?

17.11.2005 - 15:28 Uhr

Hier hast du 2 Möglichkeiten:

Den MS Text Treiber zu verwenden.
Den Text an sich auszulesen.

Ja klar kannst du einen Stream in ein DataSet laden.
Wie du das meinst muss du das wie folgt angehen (man kann auch MemoryStreams in Form von Bildern in jeden Datensatz an sich einfügen).

Zeile auslesen.
String.Split verwenden
Jedes Item im Array einem Feld in deinem selbst definierten DataSet zuweisen
Nächste Zeile auslesen.

Sonst empfehle ich den MS Treiber, wie oben genannt.

Gruß Christian

17.11.2005 - 15:24 Uhr

Ne, nicht ganz.

Das Problem liegt am DataReader.
Pro Connection kann nur 1 DataReader verwendet werden.
-> Connection öffnen
-> DataReader auslesen & was auch immer machen
-> DataReader schließen
-> Neuen DataReader öffnen
-> ...
-> DataReader schließen
-> Verbindung schließen

16.11.2005 - 15:12 Uhr

Hallo!

Eine scheinbar simple Aufgabe:

Wie kann ich aus 2 DataTables (in einem DataSet) die Rows Updaten (ja klar über den DataAdapter) und gleichzeitig eine Statusanzeige in Form einer Progressbar anzeigen?

16.11.2005 - 12:29 Uhr

Also die ID kannst du umbennen, ich denke aber nicht, dass dann noch das SELECT ALL Statement funktioniert.

SELECT sites.ID AS SiteID, user.ID AS UserID FROM sites, users;

Bitte beachte SQL Injection!

http://de.wikipedia.org/wiki/SQL-Injection

[EDIT]--> Sorry, zur gleichen Zeit gepostet

16.11.2005 - 00:29 Uhr

Die DataSource Eigenschaft (so steht in der MSDN) sollte nicht verwendet werden und dient für interne Zwecke.

15.11.2005 - 21:29 Uhr

Ja, habe mich wohl ein wenig schlecht ausgedrückt.

15.11.2005 - 15:01 Uhr

So leicht ist das nicht, du hast ja 2 Datenquellen (einen boolean und den anderen string).

Ich kann dir nur eins empfehlen.
Beim start reinladen aus dem DataSet und beim aktualisieren auslesen und ins Set speichern.

15.11.2005 - 14:57 Uhr

Hallo!

Ich habe ein DataSet und möchte nun einen Bericht erstellen per XLST.
Das Problem: Wie kann ich eine Kreuztabelle in einem XSD Schema darstellen?
Geht so etwas überhaupt? Alternativen?

15.11.2005 - 14:54 Uhr

/* Tabellenname: t_Data */
SELECT DISTINCT t_Data.Motor
FROM t_Data
WHERE t_Data.Typ="E90"AND t_Data.Motor IN(SELECT t_Data.Motor FROM t_Data WHERE t_Data.Typ="E46");

13.11.2005 - 21:10 Uhr

Ok, gute Idee.

Aber nicht unbedingt per DataSet.

Ich würde es Row für Row machen, weil wenn dir das Programm abstürzt kannst du von vorne anfangen.

Gruß Christian

13.11.2005 - 20:45 Uhr

Naja, sagen wir's mal so: Das ganze nennt sich XPath (soweit ich weiß) und ist sehr SQL ähnlich. Leider kenne ich mich nicht sehr gut damit aus.

Aber wie kommt man eigentlich an eine 300MB große XML Datei?
Ab 10MB sollte man da schon ein richtiges DBMS nehmen.

13.11.2005 - 20:10 Uhr

Du kannst doch direkt per SQL Command Änderungen vornehmen?

13.11.2005 - 19:46 Uhr

Ich würde hier an dieser Stelle noch mal gerne wissen ob es möglich ist per Net Namespace die externe IP auszulesen?

Wann geht das? (Wenns überhaupt geht)

Bsp.1: INET -> SRV -> SW/RT -> DESK
Bsp.2: INET -> RT -> DESK

INET = Internet
SRV = Server
SW/RT = Switch / Router
DESK = Desktop PC

Gruß Christian

13.11.2005 - 19:42 Uhr

300MB?
In den Arbeitsspeicher?
Per DataSet?
Hä? 🤔
Welcher Nutzer will den alle Datensätze gleichzeitig einsehen?

Also noch mal was zu großen Datenbanken.
Ich hatte mal eine Access Datentabelle (war leider als gegeben anzusehen) und dann musste ich mit VBA eine Lösung schreiben die die Zahlen in der Addressspalte in eine neue Spalte schreibt. Bei einer DB von etwas mehr als 1GB war das in 3 Tagen fertig. Relativ schnell für Access.

Wenn du nur was bearbeiten willst dann solltest du unbedingt SQL nehmen.

13.11.2005 - 19:14 Uhr

Was für ein DBMS verwendest du?

13.11.2005 - 19:13 Uhr

Also es gibt für CSV extra einen TextDriver.
http://www.connectionstrings.com/

Sonst per Hand machen.

13.11.2005 - 00:00 Uhr

Original von DeveloperX
Etwas anfängerfreundlicher, jedoch umständlichere Variante:

Die ganze Datei zeilenweise in eine ArrayList o.ö. einlesen. und dannach alle überprüfen ob zeile.StartsWith("set Targetadress = ") wahr ist. Wenn ja dann zeile = "set Targetadress = xxx". Und danach wieder alle Zeilen in die Datei schreiben.

mfg

Genau das habe ich gemacht.

Noch was zu meinem Source:
VB: Dim Var As Type -> C# Type Var;

Sonst dürfte das ganze auch für C# Leute lesbar sein.
Habe ja extra Microsoft.VisualBasic.IsNumeric() anstelle von IsNumeric verwendet, da Microsoft.VisualBasic standartmäßig importiert wird.

12.11.2005 - 23:56 Uhr

Hierzu würde ich auch noch gerne anmerken:

Ich denke ein "rethrow" macht auch Sinn, wenn man z.B. eine Klasse programmiert die mehrfach verwendet wird. Es ist so möglich, dass die "höheren" Prozeduren, Subs bzw. Voids die Exception behandeln. Je nachdem kann dann der Programmierer der Funktion damit weiter Arbeiten. (Er kann dann einschätzen den Grad des Fehlers und muss dann nicht zwangsweise eine Message anzeigen lassen.)

12.11.2005 - 23:38 Uhr

Hoffe du kannst auch VB, denn ich habe nur grade solchen zu hand:

(ungetestet):

Es wird von einer gültigen IP Addresse ausgegangen.





        Dim sReader As New IO.StreamReader("C:\my.txt")
        Dim entiretext As String = sReader.ReadToEnd()
        Dim IP As String
        Dim IPMin As String
        Dim IPMax As String
        Dim IPTemp As String
        Dim DotCounter As Int32 = 0
        Dim AdditionalCounter As Int32 = 6
        Dim i As Int32
        Dim FinalIP As String

        IP = entiretext.Substring(entiretext.IndexOf("set Targetadress = "), 15)
        'IP Beispiele 
        '0.0.0.0 (7 Zeichen, 3 Punkte)
        '192.168.100.100(15 Zeichen, 3 Punkte)
        IPMin = IP.Substring(0, 7)
        While DotCounter < 3
            AdditionalCounter += 1
            IPTemp = IP.Substring(0, AdditionalCounter)
            For i = 0 To 2
                If IPTemp.IndexOf(".") > 0 Then
                    DotCounter += 1
                    IPTemp = IPTemp.Substring(IPTemp.IndexOf("."))
                End If
            Next
        End While

        'Check last number
        For i = 1 To 3
            If AdditionalCounter + i > 15 Then
                Exit For
            End If
            IPTemp = IP.Substring(AdditionalCounter, i)
            If Not Microsoft.VisualBasic.IsNumeric(IPTemp) Then
                IPTemp = IPTemp.Substring(0, IPTemp.Length - 1)
                Exit Sub
            End If
        Next


        FinalIP = String.Concat(IP.Substring(AdditionalCounter), IPTemp)


12.11.2005 - 23:06 Uhr

wenn die Datei klein ist:

einlesen
string mystring;
mystring = mystring.Replace("set Targetadress = 123.4.55.3", "set Targetadress = 123.4.55.1");

datei überschreiben

fertig.