Laden...

Forenbeiträge von nfb503 Ingesamt 20 Beiträge

04.04.2012 - 14:46 Uhr

Hallo Forum,

auf meiner Suche nach einer Möglichkeit, den freien Speicherplatz eines gemounteten Volumes zu ermitteln (DriveInfoClass zeigt hier nur den insgesamt freien Speicher an, nicht den des Volumnes), bin ich weitergekommen.

Der Code produziert leider einen ManagementExceptionError und nach einiger Recherche, habe ich den Vredacht, dass es das Object WIN_32 Volume auf XP nicht gibt und daher der Fehler produziert wird. Da ich keine Möglichkeit habe, den Code auf einem anderem OS zu testen, kann mir jemand hier vielleicht netterweise weiterhelfen. Da der Code auch auf XP lauffähig sein muss, bräuchte ich eine Alternative, sollte meine Vermutung richtig sein.

Hier ist meine Klasse:

    class Management
    {
        public void VolSpace()
        {
            foreach (ManagementObject volume in
                new ManagementObjectSearcher("Select * from Win32_Volume").Get())
            {
                if (volume["FreeSpace"] != null)
                {
                    Console.WriteLine("{0} = {1} out of {2}",
                    volume["Name"],
                    ulong.Parse(volume["FreeSpace"].ToString()).ToString("#,##0"),
                    ulong.Parse(volume["Capacity"].ToString()).ToString("#,##0"));
                }

            }
        }
    }
05.03.2012 - 10:04 Uhr

VIELEN DANK!!!

Vielleicht etwas kompliziert und ich verstehe nicht warum, aber es funktioniert nun so, wie ich es möchte.
Falls jemand eine noch einfachere Lösung weiß, bitte posten.

So sieht es nun aus:

            try
            {
                output = new StreamWriter(outfile);//
                for (long i = 1; i < max; i++)
                {
                    output.WriteLine(i.ToString()+ ": " + outrow); 
                }
                Console.WriteLine("Es wurden " + max.ToString() + " Datensätze geschrieben");
                success = true;
            }
            catch (IOException ioe)
            {
                Console.WriteLine("Nicht genug Speicherplatz " + ioe.Message);
                success = false;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                success = false;
            }
            finally
            {
                if (output != null)
                {
                    try
                    {
                        output.Close();
                    }
                    catch (IOException e)
                    {
                        output.Close();
                    }                    
                }                
            }
05.03.2012 - 09:47 Uhr

Hallo,

Das ist ein guter Rat, nur wie kann ich im Stacktrace das überprüfen?
Wenn ich das richtig interpretiere, ist deine Vermutung richtig, siehe Details unten.
Nur wie kann ich das Problem dann lösen? Im catch Block das File wieder löschen?
Edit: das geht nämlich auch nicht, solange der Stream nicht geschlossen ist.
Also wie kann ich da lösen?

System.IO.IOException wurde nicht behandelt.
Message=Es steht nicht genug Speicherplatz auf dem Datenträger zur Verfügung.

Source=mscorlib
StackTrace:
bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
bei System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count)
bei System.IO.FileStream.FlushWrite(Boolean calledFromFinalizer)
bei System.IO.FileStream.Dispose(Boolean disposing)
** bei System.IO.Stream.Close()**
bei System.IO.StreamWriter.Dispose(Boolean disposing)
bei System.IO.StreamWriter.Close()

05.03.2012 - 09:26 Uhr

Hallo und einen schönen Wochenanfang,

ich schreibe mit Streamwriter eine Datei, ist nicht mehr genügend Platz auf dem Datenträger vorhanden, wird ein IOException Fehler ausgelöst. Diesen fange ich ab, das Programm wird aber dennoch nicht fortgesetzt, sondern es erscheint die Meldung, dass IOException nicht behandelt wurde. Mit F11 kann das Programm jedoch weiter ausgeführt werden.

Es müßte natürlich so sein, dass das Programm einfach weitermacht, ich prüfe anhand einer bool Variable, ob der Vorgang erfolgreich war oder nicht.

Was mache ich nur falsch? Hier der Code, genauso steht es auch in meinem C# Buch und der Online Hilfe.

            try
            {
                output = new StreamWriter(outfile);//
                for (long i = 1; i < max; i++)
                {
                    output.WriteLine(i.ToString()+outrow); 
                }
                Console.WriteLine("Es wurden " + max.ToString() + " Datensätze geschrieben");
                success = true;

            }
            catch (Exception e)  //auch mit (IOException in Klammern geht es nicht!
            {
                Console.WriteLine(e.Message);
                success = false;
            }
            finally
            {
                if (output != null)
                    output.Close();
            }
01.03.2012 - 15:30 Uhr

So, ich hoffe, jemand kann nochmnal helfen.

Die Klasse berechnet erst die Anzahl der Clustr pro Sektor und gibt den Platz und freien Speicher in Clustern an. Im Prinzip sind beide Werte also vollkommen identisch, wenn man die Werte der Cluster mit 4096 multipliziert.

Die Klasse erkennt aber auch nur die Gesamtgröße und freien Platz des Servers, nicht des von mir gewünschten Volumes.

Gibt es noch eine Möglichkeit, den freien Platz sowie Größe eines Volumes zu ermitteln?

01.03.2012 - 14:25 Uhr

Also ich habe den Eindruck, das funktioniert nicht oder ich mache etwas falsch.
Egal, welchen Pfad ich angebe, wird eigentlich immer dasselbe berechnet.
Die zweite Angabe stimmt, aber die erste bezieht sich nicht auf das Volume.
Seltsam.

01.03.2012 - 14:10 Uhr

Hallo,

das ist ja mal super, HZerzlichen Dank!

Verstehe ich das richtig, dass erst die Daten vom Volume (GetDiskFreeSpace) und dann vom Server (GetDiskFreeSpace) ermittelt werden?

Und weißt du zufälig um die genaue Bedeutung dieser Werte:

lpRootPathName,
lpSectorsPerCluster,
lpBytesPerSector,
lpNumberOfFreeClusters ??? freier Speicherplatz kann irgendwie nicht ganz sein
lpTotalNumberOfClusters ??? Totaler Speicherplatz kann irgendwie auch nicht ganz sein

oder muss da noch etwas umgerechnet werden?

01.03.2012 - 13:08 Uhr

Hallo,

ich aktualiseren den Beitrag, weil ich eine Lösung gefunden und gleichzeitig ein neues Problem habe. Mit uripfad kann ich den server über einen UNC ansprechen und so komme ich auf die Ebene, die ich möchte. Zur Ermittlung des freien Speichers müßte ich nun den Pfad, der ja ein Volume ist, in ein Drive umwandeln.
Dann könnte ich nämlich über die Eigenschaft FreeSpace den freien und zur Verfügung stehenden Speicher des Volumes ermitteln. So kann ich die Belegung meines Volumes ermitteln, aber nicht wieviel Speicher diesem zugeordnet ist.

Gibt es da eine Möglichkeit oder bin ich auf dem Holzweg?

Uri uripfad = new Uri("file://fsa/de/rt/");
DirectoryInfo diuri = new DirectoryInfo(uripfad.LocalPath);
            DirectoryInfo[] disuri = diuri.GetDirectories();
            foreach (DirectoryInfo duri in disuri)
            {
                Console.WriteLine(duri.Name);
                Console.WriteLine(duri.LastAccessTime);
                Console.WriteLine(duri.Attributes);
                Console.WriteLine(duri.LastWriteTime);
            }
28.02.2012 - 11:10 Uhr

Danke Dir,

Dann weiß ich wenigstens, dass ich so nicht weiterkomme und muss mir einen anderen Plan überlegen. Zum Beispiel könnte ich den Kopiervorgang einer größeren Datei probieren, um wenigstens zi sehen, ob noch Platz da ist.

28.02.2012 - 09:47 Uhr

Hallo und Guten Morgen,

ich versuche gerade eine Konsolenanwendung zu entwicklen, welche die Speicherbelegung eines Serves inkl Größe von Unterordnern sowie eine Warnung ausgibt, wenn der Platz knapp wird.
Soweit habe ich keine Probleme mit dem Code bislang, aber das Laufwerk ist intern als P: gemappt. Hinter P: verbirgt sich aber ein Server und wir haben nur ein Teil von diesem Server gemietet. Wenn ich also den freien Speicherplatz von P:\ ermittele., bringt das gar nichts, da dass der gesamte freie Platz ist und nicht der unseres Volumes. Den Server kann ich im Windows Explorer anstatt

P:\

so ansprechen, um auf die Ebene höher zu kommen.

\fsa\de\rt\

Unterhalb von \fsa\de\rt\ gibt es ein Verzeichnis 021 und das ist das Volume, um das es geht. **Nun weiß ich nicht, wie ich im Programm auf die Ebene \fsa\de\rt\ komme, um dann den freien Speicher von 021 zu ermitteln. **
Es geht um diese Zeilen:

string laufwerk = @"\fsa\de\rt&quot;;
...
...
if (dri.VolumeLabel == laufwerk)

Das geht nicht, ich weiß also nicht wie ich das korrekt schreiben muss.

Ich hoffe sehr, jemand kann mich bei meinen Bemühungen unterstützen.

26.01.2012 - 10:29 Uhr

Hallo,

Tante Google hat mich ja auf den Weg AcceptChanges erst gebracht und die Fehlermeldung in Google lieferte leider keinen einzigen Treffer.

Seltsam, nachdem ich die Zeile wieder gelöscht habe, funktioniert es nun.
Es muss noch irgendwas sich verändert haben.

24.01.2012 - 19:12 Uhr

Hallo,

das AcceptChanges habe ich eingebaut, da ohne dies ein Fehler beim Befehl da.Update kam: Das SQL Command kann ohne Schlüsselwert nicht ausgeführt werden. Mit dem AcceptChanges kommt kein Fehler mehr, aber es wird in der Tabelle auch nichts upgedatet. Die Doku dazu habe ich gelesen, aber trotzdem kapiere ich einfach nicht, wie ich einen simplen Wert in der Db verändern kann.

24.01.2012 - 16:47 Uhr

Hallo,

ich habe in mein WPF Projekt eine SQL 2008 Datenbank eingebunden.
Der Lesevorgang klappt, ich kann ein DataGrid füllen.

Jetzt wollte ich ganz einfach einen Wert in der DB ändern.
Fehler kommt keiner, aber es passiert auch nichts.
Ich habe es auch mit einem anderem SQL Command probiert (die Zeilen habe ich auskommentiert), auch kein Erfolg.

Ich hoffe, jemand kann mir auf die Sprünge helfen, ich komme nicht mehr weiter.

  public void Write()
        {

            //für den DataGrid Zugriff mit einer DataTable
            command = new SqlCommand();
            command = new SqlCommand("SELECT * FROM data1", connection);
            /*
            command.Connection = connection;
            command.CommandType = CommandType.Text;
            command.CommandText = "SELECT * FROM data1 WHERE ClientID = @ClientID";
            command.Parameters.AddWithValue("@ClientID", "1");
            */
            SqlDataAdapter da = new SqlDataAdapter(command);
            commandbuild = new SqlCommandBuilder(da);
            DataSet ds = new DataSet();

            da.Fill(ds, "data1");
            ds.Tables[0].Rows[1][1] = "Apple2";
            ds.AcceptChanges();
            da.Update(ds, "data1");
            connection.Close();

        }
19.01.2012 - 10:05 Uhr

Hallo,

ich habe mich falsch ausgedrückt. Nicht die Spalten möchte ich einschränken, sondern die Datensätze, welche im DataGrid angezeigt werden sollen. Ich habe in der SQL Datenbank um die 500 Datensätze und möchte nur diejenigen im DataGrid anzeigen, welche bestimmte Bedingungen erfüllen.
Zum Beispiel:

  • Einschränkungen anhand eines Datums
  • Einschränkungen anhand von TextWerten

Daher meine Idee mit dme DataReader. Hier habe ich auf jeden Datensatz Zugriff und könnte in ein paar simplen if Abfragen und Funktionen die Bedingungen prüfen. Das würde funktionieren.
Nur kriege ich so das DataGrid nicht angezeigt.

Und bei der Systematik mit dem DataSet weiß ich nicht, wie ich die Datensätze einschränken kann, da das teilweise komplizierte Berechnungen sind, welche ich nicht in SQL umsetzen kann.

So komme ich gerade nicht weiter (und programmiere was anderes), aber früher oder später müßte ich dieses Problem lösen, da die Anzeige der Datensätze ja der Kern der Anwendung ist.

Kann mir hierbei jemand helfen?

17.01.2012 - 10:23 Uhr

Entschuldigt, aber mir ist noch eine Frage eingefallen.

Kann man diese DataTable auch anders füllen?
Zum Beispiel über den Reader? Ich poste hier den Code mal und ich würde gerne das DataGrid während der Reader Schleife füllen.
Dann müßte ich die EInschränkunen nicht über ein SQL COmmand treffen, sondern könnte die Abfragen durch das Hinzufügen von Funktionen und Klassen vereinfachen (bin kein SQL-Freak).

Hier nochmal mein ganzer Code:

 public void DBConnect()
            {
            connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename='D:\SkyDrive\Visual C#\ErsteWPF\ErsteWPF\MyDatabase#1.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True");            
            connection.Open();

            //für den DataGrid Zugriff mit einer DataTable
            SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM data1",connection);            
            DataTable dt = new DataTable();
            da.Fill(dt);
            GriDaten.ItemsSource = dt.DefaultView;

            //Andere Verbindung über einen DataReader, hier wird zeilenweise aus der DB gelesen
            command = new SqlCommand("SELECT * FROM data1", connection);
            SqlDataReader reader = command.ExecuteReader();
            ffvalues = new List<string>();
           
            while (reader.Read())
                {
                MessageBox.Show((reader[0] + ", " + reader[1] + ", " + reader[2]));
                ffvalues.Add(reader[0].ToString());
                }
            foreach (string element in ffvalues)
                MessageBox.Show(element);

            connection.Close();
            }
17.01.2012 - 10:06 Uhr

Hallo ihr zwei,

was für ein Gefühl. Ich sehe Daten.
Vielen Dank!!! Ich habe soviel Codes aus Büchern und Internet ausprobiert und keiner führte zum Erfolg.

Zwei Fragen habe ich noch:

  • ich programmiere unter Windows XP. Hier gibt es anscheinend manche Klassen nicht MSDN. Wie kann ich diese denn "nachrüsten"?

  • Wie kann ich eigentlich eine exe Datei bzw eine Installation erstellen? Der Doppelklick auf die exe Datei bei mir klappt, aber natürlich nicht bei einem anderen Rechner.

16.01.2012 - 14:59 Uhr

Hallo,

nachdem ich die FAQ, zwei Bücher und Tante Google erfolglos befragt habe, hoffe ich, mir kann jemand helfen. Alle Versuche mit ItemSource oder einer List waren erfolglos, ich bin gerade etwas deprimiert, weil ich überhaupt nicht weiterkomme.

Ich habe mit Visual Studio 2012 eine SQL Datenbank erstellt und in das Projekt integriert. Nun möchte ich deren Datensätze in einem DataGrid angezeigt bekommen. Ich kriege das einfach nicht hin, der Zugriff auf die DB klappt, aber das DataGrid füllt sich nicht. Da ich später mit Parametern und Funktionen Datensätze limitieren möchte, gefällt mir der Reader sehr gut, da ich hier jeden Datensatz prüfen kann. Aber wie kann ich hier ein DataGrid füllen ? Mit dem internen Dataset müßte das doch alles ganz einfach gehen.

Die Anwendug soll WPF sein, sonst würde ich mich erstmal ins leichtere Windows Forms einarbeiten.

Hier ist mein Code:

    public partial class DatenFenster : Window
        {

        SqlConnection connection;
        SqlCommand command;
        SqlDataAdapter adapter;
        DataTable dt = new DataTable();
        _Mydatabase_1DataSet = new _Mydatabase_1DataSet;

\*******
HIER SOLL DER GRID GEFÜLLT WERDEN! 
NAME ist GRIDATA und AutoGenerateColumns="True"!
\*******


        public void DBConnect()
            {
            connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename='D:\SkyDrive\Visual C#\ErsteWPF\ErsteWPF\MyDatabase#1.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True");
            command = new SqlCommand("SELECT * FROM data1", connection);
            connection.Open();
            SqlDataReader reader = command.ExecuteReader();
           
            while (reader.Read())
                {
                MessageBox.Show((reader[0] + ", " + reader[1]));
                }

            connection.Close();            
            }
12.01.2012 - 14:53 Uhr

Vielen Dank für die Links. Das ist auch in meinem Buch ausführlich beschrieben, aber nicht wie man das schön anzeigen und bearbeiten kann.
Mein Problem ist weniger auf die Datenbank zuzugreifen als die Inhalte darzustellen und Interaktion mit dem User zu ermöglichen.

Die Beispieldatei bzgl xaml war doch sehr gut, ich versuche anhand dessen mich einzuarbeiten.
Jetzt habe ich hier einen DataGrid, dort werden alle Datensätze aufgelistet. Nun würde ich gerne bei Doppelklick darauf etwas in die DB zurückschreiben. Und hier hapert es.

Wie kann ich bei einem DataGrid die Elemente eines ausgewählten Datensatzes ermitteln? Es wird ja z.B pro Datensatz angezeigt: Name, Nummer, ID.
Klicke ich nun doppelt auf einen Datensatz, möchte ich von diesem den Namen ermitteln. So etwas wie DataGrid.Value oder so gibt es nämlich nicht.

Kann mir hierbei jemand helfen?

12.01.2012 - 08:40 Uhr

Hallo,

Version Access gefällt mir für den Anfang besser, XAML ist noch etwas zu hoch für mich, befürchte ich.

Kannst du mir Beispiele oder einen Link zu einem Beispielcode geben, denn ehrlich gesagt verstehe ich nur Bahnhof(Dataset, Datagrid Control). Ich wäre ja schon zufrieden, wenn ich die Datensätze, die ich ermittele, irgendwo anzeigen lassen könnte. Das ist alles, was ich bislang habe. Da kann ich nur lesen (nicht zurückschreiben) und ich kann es auch nicht anzeigen lassen.

Wenn ich noch eine where Klausel einfüge, sollte jeder Datensatz irgendwo erscheinen.

 class Access
        {
        public void Csharp_Access_Datenbank()
            {
            OleDbConnection con = new OleDbConnection(
               @"Provider=Microsoft.Jet.OLEDB.4.0;
                Data Source=P:\Orientation.mdb");
            con.Open();

            string strSQL = "SELECT * FROM data1";

            OleDbCommand cmd = new OleDbCommand(strSQL, con);
            OleDbDataReader dr = cmd.ExecuteReader();            

            //dr ist die Zeile, der Wert in spitzen Klammern die Spalte!
            while (dr.Read())
                {
                //MessageBox.Show(dr[1].ToString());                
                }
            dr.Close();             
            con.Close();
            }
        }
11.01.2012 - 19:59 Uhr

verwendetes Datenbanksystem: <Access>
Hallo Forum,

ich hoffe, hier einige Anregungen und auch Hilfe zu erhalten.
Seit zwei Wochen beschäftige ich mich mit C#, habe mir das Entwicklerbuch sowie eine DVD gekauft. Leider beantwortet das nicht meine Fragen, denn ich stehe vor folgender Herausforderung. Bislang habe ich über Excel eine Verwaltungsdatenbank programmiert (Excel als Frontend, die auf eine andere Exceltabelle als Datentabelle zugreift).
Dies soll nun in einer C# Anwendung geschehen.
Die Methoden selber machen mir keine Kopfschmerzen, aber wie ich über C# folgendes realisieren kann. Ich erwarte natürlich keine schnelle Lösung, sondern welchen Ansatz ich verfolgen sollte.

  • Datensätze sollen aus der DB in einem Formular angezeigt werden.
  • Der User soll die Datensätze bearbeiten können, das Ergebnis muss zurückgeschrieben werden.
  • Der User soll außerdem mit einem neuen Formular weitere Einzelheiten zu einem Datensatz angezeigt bekommen.
  • Eingaben sollen nicht direkt in einem Feld erfolgen (sonst könnte ich einfach ein entsprechendes Steuerelement mit der DB binden), sondern wieder über ein Formular, das den Datensatz optisch ansprechend anzeigt.

Da stehe ich nun voll auf dem Schlauch, denn in Excel ist ja ein Leichtes, Datensätze anzeigen zu lassen und Rechtsklich-Ereignisse etc zu definieren.

Wie kann ich in C# vorgehen? Es gibt soviele verschiedene Möglichkeiten. Ameinfachsten wäre es, die Excel Tabelle in eine Access DB zu importieren und auf diese zuzugreifen. Nur gibt es kaum Literatur zum Thema Access und C# und ich habe bislang nur den Code gefunden, eine Access DB zu öffnen und eine Schleife über Datensätze. Aber wie kann ich diese in einem Formular anzeigen lassen, wie kann Änderungen zurückschreiben, wie kann ich einen Rechtsklich Ereignis auf einen Datensatz realisieren etc etc.

Bin für alles dankbar, was ihr mir schreibt.