I’m writing a music player application using WPF (C#). As part of its functionality, I’m populating a music library, where I’m storing the Title and Path to an mp3 file. The user gets to select a root folder for his music library and then the contents are populated in a “Songs” table. This is the code that I’ve written:
private void Populate_Click(object sender, RoutedEventArgs e)
{
// Folder browser
FolderBrowserDialog dlg = new FolderBrowserDialog();
dlg.ShowDialog();
string DirectoryPath = System.IO.Path.GetDirectoryName(dlg.SelectedPath);
// Get the data directory
string[] A = Directory.GetFiles(DirectoryPath, "*.mp3", SearchOption.AllDirectories);
string[] fName = new string[A.Count()];
// Initialize connection
string connstr = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True";
SqlConnection conn = new SqlConnection(connstr);
conn.Open();
// Create the SqlCommand
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "InsertSongs";
// Create the parameters and execute the command
for (int i = 0; i < A.Count(); i++)
{
fName[i] = System.IO.Path.GetFileName(A[i]);
cmd.Parameters.AddWithValue("@Title", fName[i]);
cmd.Parameters.AddWithValue("@Path", A[i]);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("Error: " + ex.Message);
}
finally
{
listBox1.Items.Add(A[i]);
listBox2.Items.Add(fName[i]);
cmd.Parameters.Clear();
}
}
// Close the connection
cmd.Dispose();
conn.Close();
conn.Dispose();
}
The code for the stored procedure is simple –
ALTER PROCEDURE dbo.InsertSongs
(
@Title nvarchar(50),
@Path nvarchar(50)
)
AS
INSERT INTO Songs(Title, Path) VALUES(@Title, @Path)
Now, when I execute the program, there is no error message thrown (the file names and directory names have size less than 50). However, at the end of execution, no value is inserted in the Songs table.
The Songs table is described as below:
ID int Title nvarchar(50) Path nvarchar(50)
I’m not sure where I went wrong: I have also tried using SqlParameter and then defining the type of parameter as NVARCHAR with size 50, but to no avail. May I kindly request you to assist me here? Many thanks in advance.
The whole User Instance and
AttachDbFileName=approach is flawed – at best! Visual Studio will be copying around the.mdffile and most likely, yourINSERTworks just fine – but you’re just looking at the wrong .mdf file in the end!If you want to stick with this approach, then try putting a breakpoint on the
myConnection.Close()call – and then inspect the.mdffile with SQL Server Mgmt Studio Express – I’m almost certain your data is there.The real solution in my opinion would be to
install SQL Server Express (and you’ve already done that anyway)
install SQL Server Management Studio Express
create your database in SSMS Express, give it a logical name (e.g.
SongsDatabase)connect to it using its logical database name (given when you create it on the server) – and don’t mess around with physical database files and user instances. In that case, your connection string would be something like:
and everything else is exactly the same as before…