Laden...

[gelöst] Generelle frage zu FireBird

Erstellt von Voidcore vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.720 Views
V
Voidcore Themenstarter:in
106 Beiträge seit 2007
vor 15 Jahren
[gelöst] Generelle frage zu FireBird

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.

F
10.010 Beiträge seit 2004
vor 15 Jahren

Deswegen gibt es ja den Embedded.
Der ist genau dafür gedacht.

Beispiele gibt es beim ADO.NET Provider von Firebird.

V
Voidcore Themenstarter:in
106 Beiträge seit 2007
vor 15 Jahren

Danke, also such ich an der richtigen stelle 😃

V
Voidcore Themenstarter:in
106 Beiträge seit 2007
vor 15 Jahren

Gibt es ein Client wie "phpmyadmin" womit ich die Datenbank anschauen kann?

K
231 Beiträge seit 2005
vor 15 Jahren

moin,

ibexpert

Raik

M
221 Beiträge seit 2008
vor 15 Jahren

Ist nicht phpmyadmin, aber ein admin tool für firebird embedded:

http://www.deltamind.de/wiki/default.aspx/KnowledgeBase/FirebirdEmbedded.html?diff=y

J
3.331 Beiträge seit 2006
vor 15 Jahren

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

V
Voidcore Themenstarter:in
106 Beiträge seit 2007
vor 15 Jahren

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.

T
219 Beiträge seit 2006
vor 15 Jahren

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

V
Voidcore Themenstarter:in
106 Beiträge seit 2007
vor 15 Jahren

		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
F
10.010 Beiträge seit 2004
vor 15 Jahren
  1. Immer Using für Connection benutzen, das macht ein automatisches Dispose.

  2. 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().

V
Voidcore Themenstarter:in
106 Beiträge seit 2007
vor 15 Jahren

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?

F
10.010 Beiträge seit 2004
vor 15 Jahren

Das Clear solltest Du nur vor dem löschen machen.

Naja, kommt drauf an, was das insgesamt ergeben soll.

V
Voidcore Themenstarter:in
106 Beiträge seit 2007
vor 15 Jahren

Ah, ja, macht sinn. Da der Pool ja offen bleiben kann, außer beim update (was einmal pro woche sein wird)

Danke