verwendetes Datenbanksystem: FireBird
Hallo,
ich möchte ein kleines Programm schreiben welches beim start im Internet eine "datei" abruft und lokal in eine Datenbank einfügt. (updater)
Nach dem eintragen soll das Programm die lokale Datenbank nutzen.
mit FireBird embedded kann man lokal einen Server installieren.
Meine Frage: Ist es auch möglich mit der FB-DLL direkt auf die Datenbank zuzugreifen und sql anfragen stellen? Ohne selber den SQL server installiert zu haben.
Grund: ich möchte nicht das sich ein Benutzer FireBird installieren muss nur weil er meine kleine Anwendung nutzen möchte.
danke im vorraus.
Deswegen gibt es ja den Embedded.
Der ist genau dafür gedacht.
Beispiele gibt es beim ADO.NET Provider von Firebird.
Gibt es ein Client wie "phpmyadmin" womit ich die Datenbank anschauen kann?
Ist nicht phpmyadmin, aber ein admin tool für firebird embedded:
http://www.deltamind.de/wiki/default.aspx/KnowledgeBase/FirebirdEmbedded.html?diff=y
ibexpert
Der Vollständigkeit halber: Unter IBExpert ist auch eine kostenlose Personal Edition zu holen, und es gibt ein eigenes Firebird Forum.
Gruß Jürgen
Habe mir auf einen PC FireBird-2 installiet (Server)
Dort habe ich eine kleine anwendung geschrieben welche auf eine Firebird Datenbank zugreift. Dies funkioniert auch.
Nun habe ich das Project auf einen anderen PC kopiert.
Dort ist weder Firebird noch Firebid-Client installiert.
\************** Ausnahmetext **************
System.BadImageFormatException: Es wurde versucht, eine Datei mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)
bei FirebirdSql.Data.Client.Embedded.FbClient.isc_attach_database(Int32[] statusVector, Int16 dbNameLength, Byte[] dbName, Int32& dbHandle, Int16 parmBufferLength, Byte[] parmBuffer)
bei FirebirdSql.Data.Client.Embedded.FesDatabase.Attach(DatabaseParameterBuffer dpb, String dataSource, Int32 port, String database)
bei FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect()
bei FirebirdSql.Data.FirebirdClient.FbConnectionPool.Create()
bei FirebirdSql.Data.FirebirdClient.FbConnectionPool.CheckOut()
bei FirebirdSql.Data.FirebirdClient.FbConnection.Open()
bei TGFS.MainForm.ToolStripButton1Click(Object sender, EventArgs e) in c:\Dokumente und Einstellungen\Maik\Desktop\TGFS-SQL\TGFS\MainForm.cs:Zeile 89.
bei System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
bei System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
bei System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
bei System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ToolStrip.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Ich habe in meinem Projekt:
Program.exe
fbembed.dll
FirebirdSql.Data.FirebirdClient.dll <- diese beim c# Projekt aks Referenz angegeben
ib_util.dll
icudt30.dll
icuin30.dll
icuuc30.dll
Hat jemand eine Idee was ich falsch gemacht habe?
Die Datenbank wurde mit einem Programm erstellt welche die selbe datei wie oben beinhalten.
Ich hatte mal ein ähnliches Problem: Es lag damals daran, dass die msvcr71.dll und die msvcp71.dll auf dem Zielrechner nicht verfügbar waren.
Das sind M$ DLL.
Gruß
Thomas
void ToolStripButton1Click(object sender, EventArgs e)
{
if (File.Exists(@"FleetData.fdb"))
{
// Verbindung aufbauen
FbConnection conn = new FbConnection(fbConnectionString);
conn.Open();
// lokale version abfragen
string sqlstr = @"SELECT * FROM version;";
FbCommand cmd = new FbCommand(sqlstr, conn);
FbDataReader fbreader = cmd.ExecuteReader();
int version = 0;
if (fbreader.Read())
version = (int)fbreader["id"];
fbreader.Close();
conn.Close();
// online veersion abfragen
HttpWebResponse response = (HttpWebResponse)WebRequest.Create(@"http://xxxxx/nf/tgfs/FleetData.txt").GetResponse();
string serverVersion = new StreamReader(response.GetResponseStream()).ReadToEnd();
// vergleichen
if (int.Parse(serverVersion) == version)
{
MessageBox.Show("Die aktuelle version liegt bereits auf dem PC");
}
else
{
DownladFleetData();
UpdateForm();
}
}
else
{
DownladFleetData();
UpdateForm();
}
}
// Alte Datenbank loeschen und neue Downloaden
void DownladFleetData()
{
toolStripStatusLabel1.Text = "Download Data!";
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(@"http://xxxxx/nf/tgfs/FleetData.fdb");
HttpWebResponse hwrs = (HttpWebResponse)hwr.GetResponse();
BinaryReader br = new BinaryReader(hwrs.GetResponseStream());
if (File.Exists(@"FleetData.fdb"))
File.Delete(@"FleetData.fdb");
}
Kann mir jemand sagen wie ich die Datei noch freigeben kann?
weil conn.close und alles hab ich ja eigentlich gemacht.
System.IO.IOException: Der Prozess kann nicht auf die Datei "C:\Dokumente und Einstellungen\Maik\Desktop\TGFS-SQL\TGFS\bin\Debug\FleetData.fdb" zugreifen, da sie von einem anderen Prozess verwendet wird.
at System.IO.__Error.WinIOError
at System.IO.File.Delete
Immer Using für Connection benutzen, das macht ein automatisches Dispose.
Deine herangehensweise ist ein Sonderfall, da im Normalfall niemand
ohne not die DB selber löscht.
Der Grund, warum du die Datei nicht löschen kannst ist, das das
Connectionpooling die Verbindung weiterhin aufrecht erhält.
Dafür hat FBConnection die funktion ClearAllPools().
FZelle, danke. Es Funktioniert!
// Verbindung aufbauen
using (FbConnection conn = new FbConnection(fbConnectionString))
{
string sqlstr = @"SELECT * FROM version;";
FbCommand cmd = new FbCommand(sqlstr, conn);
conn.Open();
// lokale version abfragen
FbDataReader fbreader = cmd.ExecuteReader();
if (fbreader.Read())
version = (int)fbreader["id"];
}
FbConnection.ClearAllPools();
Der grund für das löschen.
Das programm bezieht die aktuelle datenbank.
Sollte eine neuer Datenbank vorhanden sein, will ich diese downloaden, und mit der auf der Festplatte ersetzen.
Löschen, und die gedownloadet schreiben.
Oder ist sowas anders möglich?
Das Clear solltest Du nur vor dem löschen machen.
Naja, kommt drauf an, was das insgesamt ergeben soll.
Ah, ja, macht sinn. Da der Pool ja offen bleiben kann, außer beim update (was einmal pro woche sein wird)
Danke