Hallo Stefan,
auf klassische Access-Datenbanken (Dateierweiterung .mdb) kannst du nur aus 32-Bit-Applikationen zugreifen, da der JET-Treiber, der dazu verwendet wird, nur in 32 Bit vorliegt.
EDIT:
Verwendest du die Jet-MDB-Datenbank, oder das neue .ACCDB-Format?
Wenn du ACCDB-Verwendest - vergiss meine Antwort 😉
Office 365 wird vermutlich auf der Maschine jedoch als 64 Bit installiert sein, wodurch sich dein 2. Problem ergibt (vermute ich jetzt mal) - die 32 Bit-Anwendung, die zwar jetzt die Datenbank lesen kann, kann mit den 64-Bit Komponenten vom Office nicht mehr kommunizieren.
Problem 1 lässt sich somit nur umgehen, wenn du eine Datenbank verwendest, die auch mit 64 Bit läuft (SQLite, SQL Server). Dann kannst du eine 64-Bit-Applikation bauen, die dann auch mit dem (vermutlich) 64-Bit-Office läuft.
Daniel
Servus,
Deine Main-Funktion sowie Console.WriteLine sind beides Methoden, das ist soweit korrekt. Ich würde es in deinem Fall jedoch so spezifizieren:
Deine "Main"-Methode ist eine Methodendeklaration, d.h. du definierst bzw. erstellst selbst eine Methode, die bestimmte Anweisungen ausführt
Das Console.WriteLine ist ein Methodenaufruf, d.h. du rufst eine bestehende Methode des .NET Frameworks, oder auch eine selbst von dir deklarierte Methode auf.
Mit diesen Begriffen gilt dann folgendes: Du kannst keine Methode innerhalb einer anderen Methode deklarieren (Ausnahme sind anonyme Methoden), allerdings kannst du beliebige Methoden aus einer anderen Methode aufrufen. Und dies sowohl mehrfach, als in Schleifen und auch verschiedenen Ebenen.
Hoffe das machts etwas klarer 😃
Daniel
Ist eventuell die 32Bit-Version von Excel oder der Runtime installiert?
Wenn ja - muss deine Applikation auch als x86 in 32 Bit kompiliert werden, da ansonsten der 64-Bit Prozess nicht auf den Treiber zugreifen kann. Das ist auch eine kleine Stolperfalle, gleiches z.B. wenn du per OleDB den JET-Treiber verwenden willst.
Bei mir war's auch der Arbeitsspeicher (Notebook), bei einem im Kurs die Grafikkarte, beim nächsten die Festplatte - eigentlich haben alle relativ einfache, nicht komplexe Themen gehabt - eben um Sie in den 15 Minuten durchzubringen (4-Stufen-Methode).
Ein unrühmliche Ausnahme bilden hier aber tatsächlich die Zertifikate von StartSSL mit denen das TimeStamping nicht funktioniert. Diese Zertifikate sind also für das Codesigning nicht wirklich zu empfehlen.
Das kann ich so nicht bestätigen - ich habe jetzt die StartSSL-Zertifikate seit ein paar Jahren in Verwendung, nachdem die von K-Software vor ein paar Jahren immer sehr "kompliziert" waren was Einzelunternehmen angeht, da hier immer die Unterlagen nicht passten.
Und meine StartSSL-Zertifikate kann ich genauso über den Verisign-Timestamp-Server timestampen lassen, das geht ohne Fehler oder Probleme. Am Ende ist in der signierten EXE-Datei dann auch der Zeitstempel drin.
Daniel
Hallo,
die Fehlermeldung sagt doch eigentlich bereits alles 😉
Es wurde kein Argument angegeben, das dem formalen Parameter "Label_Wort" von "Form1.WordMethode(Label)" entspricht.
Dem Methodenaufruf fehlt also ein Argument. Deine Funktion in Form1 erfordert ein Argument, da du das bei der Funktion so definiert hast (das in den Klammern, "Label_Wort"):
public static void WordMethode(System.Windows.Forms.Label Label_Wort)
{
Label_Wort.Text = Convert.ToString(wort);
}
Daher musst du beim Aufruf auf dieses Argument natürlich mit angeben, also dein Label_Wort:
Form1.WordMethode(Label_Wort);
Ansonsten weiß die Funktion ja nicht, welches Label es verwenden sollte.
Daniel
Andere Möglichkeit: Hast du eventuell keine Schreibrechte auf die Datenbank auf Windows-Ebene? Also Datenbank Schreibgeschützt oder Benutzer ohne Berechtigung?
Hallo,
Du kannst dem Tool ILMerge mehrere DLLs in deine EXE mergen, damit hättest du am Ende nur noch eine Datei die du weitergeben musst. Das klappt aber nur mit .NET Assemblys soviel ich weiß, aber das sollte ja in Ordnung sein.
Daniel
Hallo chribl,
Ich behaupte jetzt einfach mal dass das nichts mit dem Programmieren zu tun hat. Kann es sein, dass die Access-Datenbank, also das MDB File zu deinem C# Projekt gehört, also im Visual Studio im Projekt eingebunden ist? Und sich die MDB auf diedu im Programm zugreifst im gleichen Ordner befindet wie deine EXE Datei?
Falls ja, ist in den Eigenschaften der Datei im Visual Studio eventuell eingestellt dass die Datei beim erstellen des Projektes neu in das Ausgabeverzeichnis kopiert wird - und damit deine Änderungen wieder überschreibt.
Prüf das auch mal - hört sich für mich sehr stark danach an.
Daniel
Hallo,
läuft auf den IPCs ein vollständiges Windows 7, oder ist es ein Embedded Windows7?
Beim Embedded Windows 7 gibt es die Möglichkeit die Komponente "Message Box Default Reply" zu aktivieren, die jede MessageBox automatisch beantwortet, und dadurch erscheint keine MessageBox (https://msdn.microsoft.com/en-us/library/ee832759.aspx#Component_Configuration).
Wobei das auch seltsam wäre wenn manche Boxen gehen und manche nicht. Eventuell hilft ein Blick ins EventLog von Windows - wenn es am Message Box Default Reply liegen würde, würde das normalerweise was geloggt werden.
Daniel
Hallo,
es gibt für die "klassische" JET-Engine mit den alten Treibern (und mit den klassischen MDB-Dateien von Access) keine Möglichkeit, diese unter 64 Bit zum laufen zu bekommen. (gibts auch einige Microsoft-Infos dazu How to get a x64 version of Jet?).
Die einzige Möglichkeit ist entweder, die Anwendung als 32 Bit zu kompilieren, dann gehen auch die JET-Geschichte wieder. Alternative, wenns 64 Bit sein muss, musst du auf den ACE-Treiber von Microsoft umstellen, der zusätzlich installiert werden muss. Der soll das auch können, mehrere Firmen machen das auch über die ACE-Treiber, um die Kompatibilität zu gewährleisten (Verwendung von 64-Bit-Applikationen mit Microsoft Access-Datenbankdateien).
Da wird aber ADOX auch nicht funktionieren, da es hier keine 64 Bit Version von gibt - hier muss alles auf ACE umgestellt werden.
Gibt einiges dazu auf Stackoverflow:
If you deploy your application on a 64 bit machine your code couldn't use ADOX via JET.OleDB.4.0
If this is the case, then, a fast solution could be to change your target architecture to x86.Otherwise you could try to download and install on the target machine the 64bit version of Microsoft Access Database Engine drivers, but I don't know if they support ADOX. You will also need to change your connection string
Daniel
Mit dem HTML Agility Pack (http://htmlagilitypack.codeplex.com/) könnte man schon mal die "quasi" XPath-Query auf ne HTML-Seite durchführen. Funktioniert eigentlich relativ reibungslos, auch wenn natürlich die HTML-Seite kein XML ist...
Hallo,
die Datenbank wird, soweit ich weiß, beim anhängen direkt auch ohne irgendeine Bearbeitung auf das aktuelle Format des SQL-Servers aktualisiert. Ein anhängen an eine alte Version ist dann nicht mehr möglich, nur noch ein Anhängen an eine gleiche oder neuere Version.
Ich denke nicht dass man das unterbinden kann, da der 2012er einige Änderungen an der Datenbankdatei durchführt, die halt der 2008er nicht mehr kann.
Dazu gibts auch im Internet ein bisschen was dazu, so wie ich das sehe ist die einzige Möglichkeit die Datenbank wieder an den "alten" Server zu bekommen das erzeugen von dementsprechenden Generate-Skripts, um die Datenbank im alten Server wieder zu erstellen:
SQL Server 2008 R2 bumps the database version
Cannot be opened because it is version 706. This server supports version 661 and earlier
Grüße,
Daniel
Hallo,
versuch mal im Connection-String den InitialCatalog anzugeben, damit der SQL Server auch weiß, in welcher Datenbank sich die Tabelle "tblOverview" befindet. Bisher gibst du Ihm mit der Data Source ja nur den Server, aber nicht die Datenbank selbst.
Also z.B.:
Data Source=ARBEITS-PC;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;Initial Catalog=Test"
Dann sollte er das Objekt eigentlich auch finden 😉
Grüße,
Daniel
Hallo,
wenn ich das ganze jetzt richtig verstehe, müssten doch die Befehlszeilenargumente das richtige sein, was du suchst?
Wenn du eine Datei auf das Desktop-Icon deiner Applikation ziehst, wird normalerweise die Anwendung gestartet, und die Datei als Befehlszeilenargument übergeben, oder irre ich mich da?
Grüße,
Daniel
Hallo,
mit der DockPanel Suite oder entsprechenden kostenfpflichtigen Komponenten (DevComponents, DevExpress, Infragistics...) lässt sich sowas alternativ auch umsetzen. Da ist halt dann schon alles fertig 😉
Daniel
Hallo,
also der Connector muss selbst nicht auf dem Ziel-System installiert werden (über den MySQL-Installer).
Ich liefere die MySql.Data.dll auch mit meinem Programm nur im Programmverzeichnis mit, eine Installation ist hier nicht notwendig, es reicht, wenn sich die DLL im Programmverzeichnis mit den anderen Assemblys befindet (oder der bin-Ordner im Webprojekt).
Daniel
Alternativ neben dem Bizspark Programm gibts auch noch das Microsoft Action Pack (Development and Design) (Microsoft Action Pack-Abonnement).
Kostet glaub ich um die 400 Euro pro Jahr, und da sind auch Visual Studio, Microsoft Windows, Office usw. enthalten.
Hallo,
ich würde an deiner Stelle wirklich nur die Steuerelemente im Form sperren, und nicht die ganze Form. Also quasi so:
foreach (Control c in Controls)
{
c.Enabled = false ;
}
Damit umgehst du das Problem ganz, weil ob ein Disablen des gesamten Fensters so in diesem Sinn gedacht ist, glaube ich nicht 😉
Lg,
Daniel
Hallo,
du kannst die MySQL-Internen Tabellen abfragen, in denen die einzelnen Tabellen und Datenbanken verzeichnet sind. Das könnte dann in etwa so aussehen:
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'DATABASENAME' AND table_name = 'DATATABLENAME'"
Mit nem ExecuteScalar mit dem oben genannten SQL-Befehl solltest du herausbekommen ob die Datenbank existiert, oder nicht. Zusätzlich kannst du noch prüfen, ob eine Tabelle darin besteht, oder ob die Datenbank leer ist.
Daniel
Vielleicht reicht ja auch ein PropertyGrid für die Anzeige der Einstellungen aus:
Lg,
Daniel
Hallo,
also ich kann hier meinen Senf zu dem Kobo dazugeben, den habe ich nämlich 😉 (Kobo Touch, http://www.kobobooks.de/touch).
Bisher habe ich überwiegend gute Erfahrungen mit dem Kobo gemacht. Hauptgrund, warum es ein Kobo wurde, war der Preis und der Wunsch, nicht unbedingt von Amazon mit den eBooks abhängig zu sein.
Negative Punkte gibt's eigentlich nur wenige:
Aber ansonsten bin ich mit dem Kobo Touch vollstens zufrieden, und kann den eigentlich nur weiterempfehlen!
Daniel
Hallo,
alternativ ist auch das GMaps.NET-Projekt eine gute Anlaufstelle.
Das ist im Endeffekt ein Control, bei dem du die Kartenanbieter (Google, Bing, OpenStreetMaps...) einfach umschalten kannst.
Link: http://greatmaps.codeplex.com/
Das Control kann auch noch Routen anzeigen, Punkte als Icon mit Bildern markieren und und und...
Mfg,
Daniel
Hi,
das Event ist ja lt. MSDN WebBrowser.NewWindow-Ereignis vom Typ "CancelEventHandler", dadurch meckert der Compiler natürlich, wenn du das ganze als "normalen" System.EventHandler verwenden willst.
Folgendes sollte gehen:
test.NewWindow += new System.ComponentModel.CancelEventHandler(webBrowser1_NewWindow);
test.NewWindow += new CancelEventHandler(webBrowser1_NewWindow);
test.newWindow += webBrowser1_NewWindow;
Daniel
Hi,
ergibt das aber dann nicht das Problem, wenn jemand den höheren Build ohne eine bereits Installierte Version installiert, dass der dann keine Datenbank hat?
Weil eine Vorgängerversion war ja nicht installiert, daher auch keine Datenbank auf dem PC vorhanden?
Leider kenn ich mich mit dem VS-integrierten Installer nicht wirklich aus, aber ich habe jetzt bei einer kurzen Suche des öfteren gelesen, dass das mit dem "nicht-überschreiben" so ohne weiteres nicht im VS gemacht werden kann.
Daniel
Hallo,
welcher Installer wird denn verwendet?
Ich habe das selbe Vorhaben (Datenbank wird einmal bei einer erstinstallation installiert, danach weder deinstalliert noch bei einem Update überschrieben) mit InnoSetup ohne Probleme umsetzen können.
InnoSetup bietet bei Dateien z.B. folgende Flags, die das möglich machen:
onlyifdoesntexist - Kopiert eine Datei nur, wenn es sie noch nicht gibt
uninsneveruninstall - Deinstalliert eine angegebene Datei nicht.
Daniel
Bei verschiedenen Datentypen wirst du immer ein bisschen was anpassen müssen, seis die Hochkommas, oder andere Sachen, die jede Datenbank etwas anders macht. Bei MySQL ist dann unter Linux z.B. auch zu beachten, dass es alles Case Sensitive ist.
Hier ist ein O/R-Mapper das vernüftigste, da viele hier das Mapping und die SQL-Befehle automatisch korrekt absetzen.
Deine Spalte "maid" ist die ID des Mitarbeiters, oder? Dann ist die Spalte vermutlich eine Zahl - also gehören hier bei der Abfrage keine Hochkomma hin, da diese einen String kennzeichnen.
Ansonsten kannst du die Typen "DbCommand", "DbConnection", "DbDataAdapter" usw. verwenden, die keinen speziellen Datenbanktypen zugeordnet sind. Also z.B.:
DbConnection Test = new MySqlConnection(ConnectionString);
Daniel
Hi,
connection = new [B]MySqlConnection[/B](@"Data Source=" + dbhost + ";User Id=" + dbname + ";Password=" + dbpassword + ";Initial Catalog=" + dbdb + ";");
Wieso erstellst du eine MySQL-Connection, wenn du auf einen SQL-Server zugreifen willst? Oder ist das ein Tippfehler? 😉
Daniel
Wenn's ein bisschen was kosten darf, wäre das hier auch noch was was das kann:
http://www.devcomponents.com/dotnetbar/NavigationBar.aspx
Nutze ich selbst auch und bin seit Jahren vollstens zufrieden.
Daniel
Hallo,
natürlich:
DbConnection MeineConnection = new MySqlConnection(...);
Daniel
Hi,
du kannst eine eigene Klasse von der Klasse "GMapMarker" ableiten:
internal class GMapLogo : GMapMarker
{
public float? Bearing = 0.0f;
public GMapLogo(PointLatLng p)
: base(p)
{
base.Size = new Size(Symbole.Logo_16.Width, Symbole.Logo_16.Height);
base.Offset = new Point(-10, -8);
}
public override void OnRender(Graphics g)
{
// g.DrawImageUnscaled(GMap.NET.Properties.Resources.shadow50, base.LocalPosition.X, base.LocalPosition.Y);
if (Bearing.HasValue)
{
g.TranslateTransform(base.ToolTipPosition.X, base.ToolTipPosition.Y);
g.RotateTransform(Bearing.Value);
g.ResetTransform();
}
g.DrawImageUnscaled(Symbole.Logo_16, base.LocalPosition.X, base.LocalPosition.Y);
}
}
In dieser eigenen Klasse kannst du dann, wie ich hier gemacht, ein eigenes Icon oder Bild zeichnen (in der OnRender-Funktion ganz unten).
Daniel
Hi,
die Zurodnung(en) der COMxx... Bezeichner werden ja in der Registry zu den Geräten gespeichert. Über die Registry könntest du die "Friendly Names" der COM-Ports auch ändern.
Changing Your Modem's COM Port Manually
Daniel
Hi,
prüfe mal im Konstruktor der "CreditsForm", ob dort "InitializeComponents" aufgerufen wird. Falls nicht, wird auch nur ein leeres Form angezeigt 😉
Daniel
Hi,
also ich habs mal kurz bei mir ausprobiert - und es funktioniert.
Er sucht natürlich immer noch in dem Ordner, wo die EXE liegt, aber auch in den angegebenen Ordner(n). Ich habe mal testweise eine benötigte DLL aus dem EXE-Ordner in einen Unterordner namens "Shared" kopiert -> ohne app.config-Änderung stürzt die Anwendung wie erwartet ab.
Danach habe ich die "WinBook.exe.config" (WinBook.exe ist Programm-Datei) u.A. auf das geändert:
<startup>
<supportedRuntime version="v2.0.50727"/></startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Shared"/>
</assemblyBinding>
</runtime>
Und schon lädt er die DLL wieder, diesmal aus dem Shared-Ordner, weil sie sonst nirgends liegt 😉
Daniel
Hi,
.NET sucht meineswissens abhängige DLLs immer zuerst im GAC, dann im Programmverzeichnis (gleicher Ordner wie die EXE), und dann in den Pfaden, die in den Umgebungsvariablen festgelegt sind. In Unterordnern wird nach DLLs meines wissens überhaupt nicht gesucht, ausser das wird durch die app.config für die Anwendung festgelegt.
Infos zum "probing"-Elment gibts hier: <probing>-Elment
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
Das sollte das gewünschte sein 😉
Daniel
Hi,
meines Wissens nach "macht" AutoToolboxPopulate nur etwas, wenn ein Control in deinem eigenen Source-Code erstellt wird, also die Klasse in deinem Projekt enthalten ist. Bei externen Verweisen greift AutoToolboxPopulate nicht.
Hier musst du den Verweis bzw. das Control per Hand in die Toolbox einfügen, einfach per Rechtsklick auf die Toolbox und "Choose Items" (hab nur englisches VS da), und dann ner Auswahl der DLL.
Daniel
Hallo,
http://greatmaps.codeplex.com/ kann das (über GoogleMaps, OpenStreetMaps, Yahoo Maps, Bing Maps...).
Du kannst z.B. nach Adressen suchen, glaube aber dass Sehenswürdigkeiten oder ähnliches teilweise auch gefunden werden.
Mfg,
Daniel
Hi,
du musst deinem Printdocument natürlich noch "Bescheid" geben, welche Daten und welcher Drucker denn nun verwendet werden sollen:
printDocument1.PrinterSettings = printDialog.PrinterSettings ;
Bin mir zwar auf die Schnelle nicht mehr sicher wie die beiden Eigenschaften heißen, aber die sollten PrinterSettings lauten 😉
lg,
Daniel
Hi,
das Projekt "GMap.NET" (http://greatmaps.codeplex.com/) wäre eventuell ein Anlaufpunkt, um so eine Speichermethode, wie du Sie gerne hättest, zu erstellen. GMap.NET bietet die Möglichkeit, Karten Live (aus dem Internet) in einem Windows-Control anzuzeigen, UND legt die Daten dann auf Wunsch in einer Lokalen SQLite-Datenbank ab.
Eventuell kannst du dir bei diesem Projekt die Programmteile mit der Datenbankspeicherung ansehen, und dann deine benötigten Teile in eine Datenbank legen.
Mfg,
Daniel
Hallo,
versuch das ganze doch mal mit dem MouseDown- bzw. MouseUp-Event.
Bei Windows kann ja in den Einstellungen festgelegt werden, wie Windows auf einen Klick reagiert. Ein Klick ist ja einmal runter mit der Maustaste und dann wieder hoch. Eventuell erkennt Windows schnelle klicks oftmals als einen und nicht als mehrere Kicks oder als Doppelklick anstatt einem Einzelklick. Wenn du z.B. auf das MouseUp reagierst, sollte das vermutlich besser laufen.
Mfg,
Daniel
Hi,
versuch doch mal folgenden Connection-String:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myOldExcelFile.xls;Extended Properties="Excel 12.0;HDR=YES";
Ich wäre mir nämlich nicht ganz sicher, dass OLEDB noch die neuen Excel-Files im 12er Format unterstützt. Oder hast du das irgendwo bestätigt gefunden?
Die Meldung mit dem falschen ISAM hatte ich auch schon des öfteren, die muss nicht unbedingt auf einen falschen Connection-String hinweisen. Auch Fehler in der OLEDB- oder .NET Installation und falsche Datenbanken bzw. Versionen der Datenbank können das soviel ich weiß hervorrufen.
Mfg,
Daniel
Hallo,
ich denke du musst dem Netzlaufwerk erst "FullTrust" geben, damit du etwas von diesem Laufwerk mit Vollen rechten Starten kannst:
.NET Security Blog: Using CasPol to Fully Trust a Share
Mfg,
Daniel
Hallo,
verwendest du für die Signierung schon ein gültiges Authenticode-Zertifikat? Ein Zertifikat für einen Webserver ist nämlich ein anderes, als das, das zum Signieren von Programmdateien verwendet werden soll.
Mfg,
Daniel
Hi,
- Man erstelle eine BATch Datei mit folgendem Inhalt:
Pfad zum system32 Ordner + "\msiexec.exe, "/x", {ProductCode des Projects}
Füge diese in das SetupProjekt ein und und benutze diese zum Deinstallieren.
Funktioniert auch, nur ist dann während der gesamten Deinstallation das Konsolenfenster offen...
Erstelle hier doch einfach keine Batch-Datei, sondern mithilfe des Setup-Projekts eine Verknüpfung, die als zu Startendes Programm genau die msiexec.exe mit dem Parameter und dem ProduktCode hat.
Dann brauchst du kein Batch-Script, hast keine Kommandozeile und alles ist wie in andren Programmen auch.
Mfg,
Daniel
Alle .NET Anwendungen, die Datenzugriff Funktionalität verwenden, erfordern MDAC 2.6 oder höher (empfohlen wird MDAC 2.7).
Steht sinngemäß auf einer der Microsoft-Support-Sites 😉
http://support.microsoft.com/kb/315467
Also glaub ich wirds schwierig das anders zum laufen zu bringen.
Mfg,
Daniel
Hallo,
die behandlung OEM oder ANSI müsste sich eigentlich über die Registry abändern lassen:
Der Registry-Schlüssel \HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage
ist verantwortlich für die Behandlung der Umlaute:
Wert "ANSI" => Windows-Zeichentabelle
Wert "OEM" => DOS-Zeichentabelle
Mfg,
Daniel
Hallo,
also theoretisch sollte es doch ganz einfach so gehen:
if (StringOhneLeerzeichen.Trim().Equals(StringMitLeerzeichen.Trim()))
{
// Aktion ausführen
}
Bei der Trim-Funktion musst du aufpassen, da diese ein neues String-Objekt zurückgibt, und NICHT das vorhandene Abändert, also:
String meinNeuerString = alterString.Trim();
mfg
Daniel