Naja, mir war nicht genau so klar, wo dein Problem liegt und nachdem du schon ein Regex-Pattern gepostet hattest, dachte ich, dass du diese Problem schon gelöst hättest.
Du kannst ja den String-Wert in einen Int Wert casten.
Für Reguläre-Ausdrücke gibt es ein klasse Tool (Regex-Lab) von herbivore mit dem man Patterns erstellen / testen kann: Regex-Lab
Das Pattern, mit dem du zum einen den String-Wert (z.B. Affe) und anschließend den numerischen Wert (1) bekommst, lautet: (\w+)_(\d+)
Bei "affe_1" bekommst du somit für den ersten Wert affe und für den zweiten wert die 1.
Nur eine Vermutung. Ist evtl. das erstellen der csv Datei noch nicht beendet, wenn du mittels StreamWriter zugreifst? Also das der Code zu schnell ausgeführt wird?
Testen könntest du es, in dem du den Thread mit Thread.Sleep(1000) für eine Sekunde oder länger kurz schlafen lässt.
Wäre es evlt. sinnvoller, die Datei erst im Speicher zu erstellen und anschließend auf die Platte zu schreiben?
Ich nehme an, dass du mit C# noch nicht so viel Erfahrung gemacht hast. Unter Galileo Open Book steht einiges über Verzweigungen (zb. If) und über Schleifen (zb. do - while).
Um einen weiteren Wert einzulesen musst du eben nochmal eine Zeile aus der Console lesen. Für zahl1 hast du das ja shcon geschafft.
Wie wäre es, wenn du dir eine Klasse für die einzelne Items baust. In der Klasse hast du ein Feld für den Zahlenwert und ein Feld für den String Wert. Desweiteren implementiert die Klasse das Interface IComparable<T>. Du musst die Methode CompareTo(Item item) ausimplementieren. Dort überprüfen, ob der die Stringwerte gleich sind. Ist dies der Fall, die Zahlenwerte miteinander verlgeichen.
Anschließend kannst du über List.Sort() die Liste sortieren lassen.
z.b.
public class Item : IComparable<Item>
{
private int _digit;
private string _str;
public int Digit
{
get { return _digit; }
set { _digit = value; }
}
public string Str
{
get { return _str; }
set { _str = value; }
}
public int CompareTo(Item other)
{
if(_str.CompareTo(other.Str)== 0)
{
return _digit.CompareTo(other.Digit);
}
return _str.CompareTo(other.Str);
}
}
ich muss in einer produktiv Datenbank ein paar neue Tabellen (via DDL-Statements) anlegen, welche nicht weiter komplex sind. Jetzt ist meine Frage, ob der SQL Server 2000 die komplette Datenbank sperrt, sobald neue Tabellen angelegt werden oder ob die Datenbank während dem Anlegen neuer Tabellen verfügbar bleibt.
ich habs. Ich hatte vergessen die FirebirdSql.Data.FirebirdClient.dll mit auf den Server zu kopieren. Jetzt funktioniert es.
Was ich aber nicht ganz verstehe, warum nichts ins Log File geschrieben wurde, weil der Befehl fürs logging ja vor den Firebird-Befehlen kommt.
was meinst du mit Standard-Konfigurationseigenschaften? steh grad auf dem schlauch.
meinst du damit die settings, die in der app.exe.config drinnen sind? die datei ist auf dem server und auch angepasst.
ich habe folgendes Problem:
Ich habe einen Timer. Wenn dieser Timer auslöst, dann soll eine Methode aufgerufen werden, die Daten in eine Datenbank einträgt. Auf meinem Entwicklungs-PC funktioniert das alles wunderbar. Kopiere ich die .exe Datei auf meinen Windowsserver, auf dem die Anwendungen laufen soll, funktioniert der aufruf der Methode nicht. Es wird auch keine Fehlermeldung ausgespuckt, es passiert einfach gar nichts. So als hätte ich einen Breakpoint gesetzt.
Wie gesagt, funktioniert der Aufrauf der Methode auf meinem PC ohne Probleme. Auf meinem Server funktioniert das ganze nicht mehr. Alle anderen Funktionalitäten des Programmes funktionieren auf dem Server ohne Probleme. Hat jemand Ideen, an was das liegen könnte?
Habe ich es richtig verstanden, dass du den Rückgabewert per Event weitergeben willst? Ich sehe da zwei Lösungsmöglichkeiten (Für weitere bin ich offen). Ich weiß allerdings nicht, welche die Bessere ist. Vll kann dazu jmd was sagen.
Also 1: Den Rückgabewert in eine Propertie speicher, dass Event auslösen und die Klasse die das Event abonniert hat, liest die Properite aus:
public class HandScanner
{
private object _rueckgabe;
public object Rueckgabe
{
get { return _rueckgabe;}
}
private void UeberwacheHandScanner()
{
if(_rueckgabe != rueckgabeNeuerPing)
{
_rueckgabe = rueckgabeNeuerPing;
OnChangeEvent();
}
}
public delegate void EventDelegate(object source, EventArgs e);
public event EventDelegate ChangeEvent;
private void OnChangeEvent()
{
if(ChangeEvent != null)
{
ChangeEvent(this, new EventArgs());
}
}
}
public class VerarbeiteRueckgabe
{
public VerarbeiteRueckgabe()
{
_handScanner = new HandScanner;
_handScanner.ChangeEvent += EventDelegate(_handScanner_ChangeEvent);
}
private HandScanner _handScanner;
private void _handScanner_ChangeEvent(object value, EventArgs e)
{
object rueckgabe = _handScanner.Rueckgabe;
}
}
oder 2. den Übergabewert mit ins Event verpacken:
public class HandScanner
{
private void UeberwacheHandScanner()
{
if(rueckgabeAlterPing != rueckgabeNeuerPing)
{
OnChangeEvent(rueckgabeNeuerPing);
}
}
public delegate void EventDelegate(object value, EventArgs e);
public event EventDelegate ChangeEvent;
private void OnChangeEvent(object rueckgabe)
{
if(ChangeEvent != null)
{
ChangeEvent(rueckgabe, new EventArgs ());
}
}
}
public class VerarbeiteRueckgabe
{
public VerarbeiteRueckgabe()
{
_handScanner = new HandScanner;
_handScanner.ChangeEvent += EventDelegate(_handScanner_ChangeEvent);
}
private HandScanner _handScanner;
private void _handScanner_ChangeEvent(object value, EventArgs e)
{
object rueckgabe = value;
}
}
Ich habe den Code nicht getestet. Nur kurz runtergeschrieben. Wie gesagt, so würde ich es lösen, weiß allerdings nicht, welche der Beiden Methoden besser ist.
Ich habe eine C#-Anwendung mit der ich Daten auf verschiedene Art und Weiße anlysiere. Für eine Analyse verwenden ich den Assoziations-Alogrithmus vom MS Sql Server 2005. Die benötigten Daten selektiere ich davor und lasse sie in eine extra Tabelle eintragen. Dabei handelt es sich um 100000 - 2500000 Einträge.
Meine erste Lösung sah folgendermaßen aus: Die benötigten Daten wurden in eine List<Collection> gespeichert und anschließend via SqlCommand etc. in die DB eingetragen. Der Code sieht wie folgt aus:
public void InsertTmpData(List<MyCol3<string, int, int>> resultList)
{
SqlTransaction sqlTransaction;
using(SqlConnection sqlCon = new SqlConnection(_connection))
{
sqlCon.Open();
sqlTransaction = sqlCon.BeginTransaction();
try
{
using (SqlCommand sqlCmd = new SqlCommand("INSERT INTO tmpData (word,urlId) VALUES (@word,@urlId)"))
{
sqlCmd.Connection = sqlCon;
sqlCmd.Transaction = sqlTransaction;
for (int index = 0; index < resultList.Count; index++)
{
sqlCmd.Parameters.AddWithValue("@word", resultList[index].ValueA);
sqlCmd.Parameters.AddWithValue("@urlId", resultList[index].ValueC);
sqlCmd.ExecuteNonQuery();
sqlCmd.Parameters.Clear();
_tmpIndex = index;
OnIndexEvent();
}
}
sqlTransaction.Commit();
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
sqlTransaction.Rollback();
}
finally
{
sqlCon.Close();
}
}
}
Diese Variante hat bei ca. 2,3 Mio Einträge ca. 30 - 45 min gedauert. Das hat mir persönlich zu lange gedauert und ich habe nach weiteren Lösungmöglichkeiten gesucht. Gestern hatte ich die Idee, die Daten in ein XML File zu speichern und diese XML File anschließend mit einem SSIS-Datenfluss-Prozess in die Datenbank zu transferieren. Und sieh da, das Ganze dauert nicht einmal 3 Minuten. Der SSIS Task, der die Daten aus der XML-Datei in die Datenbank kopiert, brauchte ca. zwei Minuten.
Jetzt meine Frage, warum braucht mein Code 30 - 45 Minuten und der SSIS Task ca. 2 Minuten? Liegt es daran, dass SSIS viel dichter an der DB ist oder habe ich in meinem Code eine Bremse drinnen?
ich benötige ein Steuerelement, mit dem ich ein Abhängigkeitsnetzwerk - also Objekte die von einer abhängig sind oder irgendwie im Zusammenhang stehen - erstellen lassen kann.
Der Analyse Service von MS SQL Server 2005 beinhaltet ein solches Steuerelement (Dependecy-Network) was für meine Problemstellung perfekt wäre:
Leider biete MS diese Control nicht zur freien Verfügung an. Weiß jemand von, ob irgendwo solch ein Control zu Verwendung angeboten wird (kann auch gerne was kosten)? Ich konnte bis jetzt leider nichts finden.
Ich will XML Dateien mit File.Delete(filename) löschen lassen. Allerdings passiert gar nichts, wenn dieser Befehl ausgeführt wird. Die Datei wir nich gelöscht und es gibt auch keine Fehlermeldung. Hat jemand ein Tipp woran es liegen könnte, dass das File nicht gelöscht wird?
Die XML Dateien werden von einem zweiten Programm erstellt.
Ich weiß grad nicht, ob es schon einen fertigen SQL Statement Parser im Framework gibt. Ich glaube mal nicht.
Darum müsstest du dir einen eigenen Parser bauen. Diesen könnte man mit Regulären Ausdrücken verwirklichen oder mit den String.Methoden wie string.IndexOf(), string.Substring(), string.PadRight() etc.
Mir ist nicht bekannt, dass man den Namen einer Variable auf deiner Weise deklarien kann (wenns doch geht dann bescheit geben).
Mir ist auch der Sinn nicht so ganz klar. Zum einen ist die Variable, die du versuchst in der Schleife zu erstellen nur in der Schleife gültig. Das heißt, sobald die Schleife ein weiters mal durchlaufen wird, würde es "bar0", wenn es möglich wäre, nicht mehr geben.
Wenn du dir fünf Werte generien lassen willst, dann verwende doch zur temporären Speicherung eine Collection. Zum Bsp: