J'essaie d'écrire une application dans Visual Studio C # pour écrire dans une base de données basée sur un service. Le problème que j'ai est que je n'obtiens aucune erreur, mais rien n'est enregistré dans la base de données après le redémarrage de l'application ...

Je sais qu'il écrit car il n'autorisera pas les clés primaires en double. C'est presque comme s'il s'agissait d'une base de données temporaire ... Si tel est le cas, comment en faire une base de données persistante basée sur un service?

Voici mon code:

private void button1_Click(object sender, EventArgs e)
{
    try {
        // Connection to DB
        SqlConnection con = new SqlConnection();
        con.ConnectionString = (@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MTR_Database.mdf;Integrated Security=True");

        // Insert Query
        string insertquery = "INSERT INTO dbo.Job01 ([Item #], [Manufacturer], [Mill Location], [Product Description], [Weld Seam Type], [Outer Dimension], [Wall Thickness], [Coating], [Grade], [Heat], [ANSI/ASME], [Purchase Order], [Standard]) VALUES(@ItemNum, @Manufacturer, @MillLocation, @ProductDescription, @WeldSeamType, @OuterDimension, @WallThickness, @Coating, @Grade, @Heat, @ANSIASME, @PurchaseOrder, @Standard)";

        SqlCommand cmd = new SqlCommand(insertquery, con);

        // open connection
        con.Open();

        // Parameters
        cmd.Parameters.AddWithValue("@ItemNum", item__TextBox.Text);
        cmd.Parameters.AddWithValue("@Manufacturer", manufacturerTextBox.Text);
        cmd.Parameters.AddWithValue("@MillLocation", mill_LocationTextBox.Text);
        cmd.Parameters.AddWithValue("@ProductDescription", product_DescriptionTextBox.Text);
        cmd.Parameters.AddWithValue("@WeldSeamType", weld_Seam_TypeTextBox.Text);
        cmd.Parameters.AddWithValue("@OuterDimension", outer_DimensionTextBox.Text);
        cmd.Parameters.AddWithValue("@WallThickness", wall_ThicknessTextBox.Text);
        cmd.Parameters.AddWithValue("@Coating", coatingTextBox.Text);
        cmd.Parameters.AddWithValue("@Grade", gradeTextBox.Text);
        cmd.Parameters.AddWithValue("@Heat", heatTextBox.Text);
        cmd.Parameters.AddWithValue("@ANSIASME", aNSI_ASMETextBox.Text);
        cmd.Parameters.AddWithValue("@PurchaseOrder", purchase_OrderTextBox.Text);
        cmd.Parameters.AddWithValue("@Standard", standardTextBox.Text);

        // Execute
        cmd.ExecuteNonQuery();

        // close connection
        con.Close();
    }
    catch (Exception ex)
    {
        // catch error
        MessageBox.Show(ex.Message);
    }
}

Je ne peux vraiment pas mettre le doigt sur ce qui se passe.

2
Mokey 16 janv. 2017 à 20:28

2 réponses

Meilleure réponse

L'approche AttachDbFileName = dans son ensemble est imparfaite - au mieux! Lors de l'exécution de votre application dans Visual Studio, elle sera copiée autour du fichier .mdf (de votre répertoire App_Data vers le répertoire de sortie - généralement .\bin\debug - où votre application s'exécute) et très probablement , votre INSERT fonctionne très bien, mais vous ne regardez que le mauvais fichier .mdf à la fin!

Si vous voulez vous en tenir à cette approche, essayez de mettre un point d'arrêt sur l'appel myConnection.Close() - puis inspectez le fichier .mdf avec SQL Server Mgmt Studio Express - je suis presque certain que vos données sont là.

La vraie solution à mon avis serait de

  1. installez SQL Server Express (et vous l'avez déjà fait de toute façon)

  2. installer SQL Server Management Studio Express

  3. créez votre base de données dans SSMS Express , donnez-lui un nom logique (par exemple MTR_Database)

  4. connectez-vous à lui en utilisant son nom de base de données logique (donné lorsque vous le créez sur le serveur) - et ne vous embêtez pas avec les fichiers de base de données physiques et les instances utilisateur. Dans ce cas, votre chaîne de connexion serait quelque chose comme:

    Data Source=.\\SQLEXPRESS;Database=MTR_Database;Integrated Security=True
    

    et tout le reste est exactement le même qu'avant ...

Voir également l'excellent article de blog d'Aaron Bertrand Bad habitudes to kick: using AttachDbFileName for plus d'informations de fond.

1
marc_s 16 janv. 2017 à 19:43

J'ai déjà eu ce problème et je viens de le résoudre.

N'utilisez pas |DataDirectory|\MTR_Database.mdf, utilisez le chemin complet.

0
anothernode 4 juil. 2018 à 13:37