2016-02-09 5 views
5

Anfängerfrage erstellen - bitte kann ich um Rat frage auf lokale Datenbank-Dateien programmatisch zur Laufzeit zu erstellen. Ich mag umbenennen später in der Lage sein, löschen sie etc mit dem Windows Explorer auf die gleiche Weise wie für Text und andere Dateien, und sie auf andere Computer zu kopieren.lokale Datenbank zur Laufzeit mit Visual Studio

Dies wird unter Verwendung von Visual Studio Community-15 mit C#, installiert SQL Server-Datentools 14.0.50616.0. Der Computer verfügt über Microsoft SQL Server 2014

Ein Beispiel habe ich die überschüssigen Teile meines Programms entfernt haben Sie den Code unten zu verlassen, die ein Windows Forms-Anwendung mit 3 Tasten verwendet (btnCreateDb, btnDeleteDb und btnDoesDbExist) und einer Combobox cbxDb für den Datenbanknamen. Es macht Datenbanken in einem vorhandenen Ordner C:\DbTemp.

Es wird scheinbar erstellen und löschen Sie eine neue Datenbank und machen Sie Dateien, zum Beispiel mydb1.mdf und mydb1.ldf in den Ordner, und geben Sie an, dass sie existieren. Wenn ich jedoch die beiden Dateien mit dem Explorer lösche, wird eine Ausnahme ausgelöst, wenn versucht wird, die Datenbank zu löschen oder zu erstellen. und btnDoesDbExist zeigt, dass es noch existiert.

Warum die Datenbank noch zu existieren scheinen, wenn die Dateien von Windows Explorer gelöscht wurden? Der Code unter btnDoesDatabaseExist bezieht sich nicht auf den Pfad der Dateien, so muss es etwas anderes sein zu sehen, aber wo? Ist dies eine korrekte Methode für den Benutzer des Programms, diese Datenbanken zu erstellen, zu löschen und zu erkennen?

using System; 
using System.Data; 
using System.Windows.Forms; 

//my additions 
using System.Data.SqlClient; 

namespace DataProg15 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public static string form1ConnectionString = "Data Source = (LocalDB)\\MSSQLLocalDB; Integrated Security = True; Connect Timeout = 30; "; 
    private string form1DatabasePath = "C:\\DbTemp"; 

    private void btnCreateDb_Click(object sender, EventArgs e) 
    { 
     string nameToCreate = cbxDb.Text; 
     SqlConnection myConn = new SqlConnection(form1ConnectionString); 

     string str = "CREATE DATABASE " +nameToCreate+ " ON PRIMARY " + 
      "(NAME = " +nameToCreate+ "_Data, " + 
      "FILENAME = '" +form1DatabasePath+ "\\" +nameToCreate+ ".mdf', " + 
      "SIZE = 4MB, MAXSIZE = 10MB, FILEGROWTH = 10%) " + 
      "LOG ON (NAME = " +nameToCreate+ "_Log, " + 
      "FILENAME = '" +form1DatabasePath+ "\\" +nameToCreate+ ".ldf', " + 
      "SIZE = 1MB, " + 
      "MAXSIZE = 5MB, " + 
      "FILEGROWTH = 10%)"; 

     SqlCommand myCommand = new SqlCommand(str, myConn); 

     try 
     { 
      myConn.Open(); 
      myCommand.ExecuteNonQuery(); 
      MessageBox.Show("DataBase '" + nameToCreate + "' was created successfully"); 
     } 
     catch (System.Exception ex) 
     { 
      MessageBox.Show("Exception in CreateDatabase " + ex.ToString(), "Exception in CreateDatabase", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
     finally 
     { 
      if (myConn.State == ConnectionState.Open) 
      { 
       myConn.Close(); 
      } 
     } 
    } 


    private void btnDeleteDb_Click(object sender, EventArgs e) 
    { 
     string nameToDelete = cbxDb.Text; 
     string myConnectionString = form1ConnectionString + "AttachDBFileName = " + form1DatabasePath + "\\" + nameToDelete + ".mdf "; 
     string str = "USE MASTER DROP DATABASE " + nameToDelete; 

      SqlConnection myConn = new SqlConnection(myConnectionString); 
      SqlCommand myCommand = new SqlCommand(str, myConn); 
      myConn.Open(); 

      try 
      { 
       myCommand.ExecuteNonQuery(); 
       MessageBox.Show("DataBase '" + nameToDelete + "' was deleted successfully"); 

      } 
      catch (System.Exception ex) 
      { 
       MessageBox.Show(ex.ToString(), "Exception in DeleteDatabase '" +nameToDelete+ "'", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
      finally 
      { 
       if (myConn.State == ConnectionState.Open) 
       { 
        myConn.Close(); 
       } 
      } 
    } 

    private void btnDoesDbExist_Click(object sender, EventArgs e) 
    { 
     string nameToTest = cbxDb.Text; 
     using (var connection = new SqlConnection(form1ConnectionString)) 
     { 
      using (var command = new SqlCommand(string.Format(
        "SELECT db_id('" +nameToTest+ "')", nameToTest), connection)) 
      { 
       connection.Open(); 

       if ((command.ExecuteScalar() != DBNull.Value)) 
       { 
        MessageBox.Show("DataBase '" +nameToTest+ "' exists"); 
       } 
       else 
       { 
        MessageBox.Show("Database '" +nameToTest+ "' does not exist"); 
       } 
      } 
     } 

    } 
} 

}

Vielen Dank an alle für die Antworten, und Ihre Mühe wird sehr geschätzt.

Ich verstehe jetzt, dass ich die falsche Datenbank bin mit so habe ich versucht SQL Server Compact stattdessen zu verwenden. Deinstalliert, heruntergeladen wieder und wieder installiert SQL Server Compact einschließlich SP1. Haben auch SQL Server Compact/SQLite Toolbox von https://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1 heruntergeladen und installiert. Aber Visual Studio hat durchgehend einen Fehler gezeigt, wenn ich using System.Data.SqlServerCe eintippe. Auch wenn ich schreibe SqlCeEngine oder SqlCecommand, Ich gehe davon aus dem gleichen Grund. In Visual Studio werden SQL Server Data Tools und SQL Server Compact & SQLite Toolbox als installierte Produkte angezeigt, aber nicht SQL Server Compact. Muss ich das in Visual Studio installieren, und wenn ja, wie wird es gemacht?

+0

Sie sollten nicht mit den Datendateien in Wechselwirkung treten. Wenn Sie solche Dinge wirklich machen wollen, müssen Sie 'detach' und 'attach' verwenden. Zu diesem Zeitpunkt ist Ihr localdb-sqlserver der Datenbank bekannt, kann jedoch die Datendateien nicht finden. –

+0

Dies ist möglicherweise in Ihrem Szenario übertrieben, aber haben Sie die Verwendung von [Code-First Entity Framework-Migrationen] (https://msdn.microsoft.com/en-gb/data/jj591621.aspx) in Betracht gezogen? –

+1

Sql Server ist ein komplexes System. Wenn Sie eine Datenbank erstellen, fügen Sie nicht nur ein paar Dateinamen, sondern auch viele System- und Konfigurationsinformationen hinzu. Diese Informationen werden in internen Datenbanken (Modell, Master, Temp usw.) gespeichert. Verwenden Sie den Windows Explorer, um diese Dateien zu entfernen Lässt Ihre Sql Server-Installation in einem instabilen Zustand, da die internen Informationen alle noch vorhanden sind, aber die Dateien. Wenn Sie diese Art von Freiheit benötigen, wählen Sie ein anderes Datenbanksystem (ein dateibasiertes) wie SQLite, Sql Server Compact, sogar MS-Access. – Steve

Antwort

0

SQL Server lassen Sie nicht die physischen Dateien einer Datenbank gelöscht werden, wenn die Datenbank aktiv ist - je. Das einzige, würden Sie jemals in der Lage sein, dies zu tun ist, wenn die Datenbank getrennt wird (wie bereits erwähnt)

So vermute ich, etwas zu sagen Sie uns Ihre ist nicht ganz richtig ??

würde ich Ihre ändern „Check-Datenbank vorhanden ist“ Logik zu sein;

select * from sys.databases where name = 'yourdatabasename'

ich diese Abfrage sowieso laufen würde, wenn Sie Ihre Datenbank gelöscht haben, nur um zu sehen, was es gibt.

+0

Danke. Antworten und weitere Lektüre schlagen vor, dass ich eine Datenbank verwenden sollte, die nur in der lokalen Datei existiert, also versuche ich stattdessen "SQL Server Compact" zu verwenden, aber immer noch Schwierigkeiten, wie in der obigen Bearbeitung erklärt. – egginstone

2

In Solution Explorer unter References überprüfen, dass System.Data.SqlServerCe aufgeführt ist.Wenn nicht, klicken Sie rechts auf References dann Add Reference ->Browse Taste und wählen Sie die Datei System.Data.SqlServerCe.dll, wahrscheinlich in C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop. System.Data.SqlServerCe sollte nun unter erscheinen.

Das Programm erscheint unten zu arbeiten, und ist viel einfacher. Danke an alle für Ihre Hilfe.

using System; 
using System.Data; 
using System.Windows.Forms; 
//my additions 
using System.Data.SqlServerCe; 
using System.IO; 

namespace DataProg15 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public static string form1DatabasePath = "C:\\DbTemp\\dbtemp1.sdf"; 
     public static string form1ConnectionString = "Data Source = " +form1DatabasePath; 

     private void btnCreateDb_Click(object sender, EventArgs e) 
     { 
       SqlCeEngine engine = new SqlCeEngine(form1ConnectionString); 
      try 
      { 
       engine.CreateDatabase(); 
       MessageBox.Show("DataBase '" +form1DatabasePath+ "' was created successfully"); 
      } 
      catch (System.Exception ex) 
      { 
       MessageBox.Show("Exception in CreateDatabase " + ex.ToString(), "Exception in CreateDatabase", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
      finally 
      { 
       engine.Dispose(); 
      } 
     } 

     private void btnDeleteDb_Click(object sender, EventArgs e) 
     { 
      if (File.Exists(form1DatabasePath)) 
      { 
       try 
       { 
        File.Delete(form1DatabasePath); 
        MessageBox.Show("DataBase '" +form1DatabasePath+ "' was deleted successfully"); 
       } 
       catch (System.Exception ex) 
       { 
        MessageBox.Show(ex.ToString(), "Exception in DeleteDatabase '" +form1DatabasePath+ "'", MessageBoxButtons.OK, MessageBoxIcon.Information); 
       } 
      } 
     } 

     private void btnDoesDbExist_Click(object sender, EventArgs e) 
     { 
      if (File.Exists(form1DatabasePath)) 
      { 
        MessageBox.Show("DataBase '" +form1DatabasePath+ "' exists"); 
      } 
      else 
      { 
        MessageBox.Show("DataBase '" +form1DatabasePath+ "' does not exist"); 
      } 
     } 
    } 
}