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?
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. –
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? –
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