Although it is strongly recommended that you avoid the use of invalid dates within your .NET application, it is possible to use invalid dates by means of the MySqlDateTime datatype.
The MySqlDateTime datatype supports the same date values that are supported by the MySQL server. The default behavior of Connector/NET is to return a .NET DateTime object for valid date values, and return an error for invalid dates. This default can be modified to cause Connector/NET to return MySqlDateTime objects for invalid dates.
To instruct Connector/NET to return a MySqlDateTime object for invalid dates, add the following line to your connection string:
Allow Zero Datetime=True
Please note that the use of the MySqlDateTime class can still be problematic. The following are some known issues:
1. Data binding for invalid dates can still cause errors (zero dates like 0000-00-00 do not seem to have this problem).
2. The ToString method return a date formatted in the standard MySQL format (for example, 2005-02-23 08:50:25). This differs from the ToString behavior of the .NET DateTime class.
3. The MySqlDateTime class supports NULL dates, while the .NET DateTime class does not. This can cause errors when trying to convert a MySQLDateTime to a DateTime if you do not check for NULL first.
Because of the known issues, the best recommendation is still to use only valid dates in your application.
Oder du probierst reader.GetString() und DateTime.TryParse.
Bei ValueTypes hat das weniger mit dem Casten zu tun, als mit dem Boxing bzw. Unboxing welches beim Einfügen und Auslesen aus einer (z.B.) ArrayList stattfindet.
Original von memphis0815
ich arbeite an einem Tool, dass Daten aus einem CSV-File, dass von einer lokalen App erstellt wird, in eine adäquate MySQL-DB schaufeln soll.
Warum machst du das selbst? Dafür gibt es z.B. mysqlimport und wenns programmatisch erfolgen soll, z.B. Filehelpers.
Lass mal die Sache mit GetExecutingAssembly().Location weg. Wenn sich die Datei im gleichen Verzeichnis wie das Programm befindet, brauchst du gar keinen Pfad anzugeben (außer natürlich Environment.CurrentDirectory wurde geändert).
Zitat
Wie trägt man den PrivateBinPath denn in der App.Config ein? In welcher Section und wie sieht der eintrag dann aus?
Original von Gemelon
Danke x86fanboy für die Antwort,
ich hatte jetzt erst Zeit das mal auszuprobieren. Es geht leider nicht. Ich habe mal den Ordner gesucht wo das hin installiert wird. Die XML Datei ist nicht im selben Ordner wie die EXE.
Wie greifst du auf die Dateien zu?
Zitat
Es ist aber notwendig dass sie im selben Ordner ist. Ausserdem habe ich noch ein paar unabhängige Komponenten als DLLs, die werden überhaupt nicht mit Kopiert. Die Komponenten sind nicht über einen verweis mit dem Hauptprogramm verbunden, die werden erst während der Laufzeit, je nach bedarf nachgeladen. Wie kann ich es anstellen dass die auch mit installiert werden?
Auch das ist kein Problem. Auch hier legst du wieder einen Ordner in deinem Projekt an, zu, fügst ihn zu den ClickOnce Dateien hinzu und trägst den Namen des Ordners in der App.config des Programms im PrivateBinPath ein.
Wir diesen beiden Dinge auch in unsere ClickOnce-Applikation und sie funktionieren ohne Probleme.
Original von Gemelon
Hallo ich habe in meinem Projekt mehrere zusätzliche Dateien, jpg, txt und andere. Diese Dateien sollen da gespeichert werden wo auch die exe-Datei des Programms ist. Wie kann ich nun ClickOnce dazu bringen die auch mit zu Installieren?
Füge die Dateien in deine VS-Solution ein, dann kannst du sie in den Publish-Optionen unter Application Files hinzufügen.
Zitat
Weiss eigentlich jemand wo die exe Datei nach der Installation ist?
C:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\Apps\2.0\ und dann die Ordner mit den kryptischen Name durchklicken.
Neben den o.g. Sachen könntest du dir auch mal LOAD DATA INFILE anschauen. Eine weitere Möglichkeit sind Prepared Statements, muss aber seperat aktviert werden, da es laut Aussage des Entwicklers vom MySql .Net Connector zu Dateninkosistenzen führen kann.
Original von eigeneachse
Hallo FZelle,
ClickOnce würde mir vom Umfang her vollkommen ausreichen. Das ist im Prinzip genau das was ich haben will. Ich habe mit ClickOnce nur das Problem, dass ich Firefox User dazu zwingen muss entweder über den IE zu installen oder das FFClickOnce Plugin zu installieren. Finde ich persönlich etwas unschön.
Damit kannst du dir eine Setup.exe erstellen, die mit allen Browsern funktioniert. Setzen wir schon längere Zeit erfolgreich ein.
Zitat
Das zweite Proble was mir bisher mit ClickOnce aufgefallen ist, ist dass manche User anstatt dem InstallDialog nur das Manifest im Browser angezeigt bekommen. Dieses Problem konnte ich bisher auch nicht Lösen.
Wahrscheinlich sendet der Server die falschen Mime-Types:
Woher sollte der Compiler auch wissen, ob eine nicht initialisierte Variable true oder false ist, bzw. welchen Wert er im Fall einer fehlenden Initialisierung zuweisen soll...
Z.B. aus der C-Sharp Language Specification
Zitat
10.4.4 Field initialization
The initial value of a field, whether it be a static field or an instance field, is the default value (§5.2) of the
field’s type. It is not possible to observe the value of a field before this default initialization has occurred, and a
field is thus never “uninitialized”. The example
using System;
class Test
{
static bool b;
int i;
static void Main() {
Test t = new Test();
Console.WriteLine("b = {0}, i = {1}", b, t.i);
}
}
produces the output
b = False, i = 0
because b and i are both automatically initialized to default values.
Mit ClickOnce wird das Framework während der Installation automatisch installiert, falls nicht vorhanden. Ansonsten -> Suche: Programm ohne Framework ausführen oder so ähnlich.
OK, ich glaube, das lasse ich lieber sein (läuft eh nur mit dem IE, und wer hat den schon noch?) ;-)
Mitnichten! Das Ganze funktioniert auch mit Firefox sehr gut, wenn man sich seine Setup.exe selbst kompiliert. Einen Link dazu habe ich schon mal geposted, sollte über die Forensuche ganz einfach zu finden sein.
Um mal ein wenig Licht in die ganze Sache zu bringen:
Drag and Drop läuft ebenso wie z.B. das Clipboard noch über COM-Interop. Dazu wird intern OleInitialize() aufgerufen, welches ein STA erfordert. Deshalb, und für den Fall das eine Windows Forms Applikation ein ActiveX-Control hostet, welches per Definition ein STA-Objekt ist, wird auch die Main()-Methode von Windows Forms Applikationen automatisch von VS mit [STAThread] markiert.
Aus der MSDN:
Zitat
A call to OleInitialize on an apartment that was previously initialized as multithreaded will fail[...]
Wahrscheinlich ist meine Intention nicht so richtig rübergekommen: es wird ja ein Pointer auf ein Windowhandle übergeben. Ich will dieses Handle nicht schliessen, da dass Fenster weiter existiert wenn obige Klasse entsorgt wird. Ich möchte den Pointer, den ich in der Klasse deklariert habe, ordnungsgemäß entsorgen und frage mich ob dazu CloseHandle notwendig ist, oder IntPtr.Zero ausreicht.
class Foo : IDisposable
{
private IntPtr handle;
public Foo(IntPtr handle)
{
this.handle = handle;
}
}
Der Konstruktor bekommt das Handle des Fensters welches die Klasse instanziert übergeben. Muss ich in Dispose() CloseHandle(this.handle) aufrufen, oder reicht es den Pointer auf IntPtr.Zero zu setzen?