VS重新启动后,SQL更改消失

埃达赫尔

我正在学习C#和SQL交互的基础知识,并且具有以下形式:

在此处输入图片说明

它向我显示了使用VS 2013 DB Builder构建的预填充DB的值,上方的按钮一切正常

这是我的桌子:

在此处输入图片说明

问题:

  • 当我单击“添加新项”时,文本框将被清除;
  • 接下来,填充文本框,当我单击“保存”时,该记录显然会添加到数据库(或至少添加到数据集?),因为它会给我一条成功的消息,并且当我使用上方的按钮浏览数据库时会显示该记录;
  • 如果我关闭并重新打开我的应用程序(不关闭VS),则插入的记录仍然存在
  • 但是,如果我关闭并重新打开VS并再次运行我的应用程序,我输入的记录就消失了
  • 另外,如果不关闭VS,则转到服务器资源管理器(VS左窗格),用鼠标右键单击我的表=>显示表数据,新记录就永远不会存在。

这是Form1.cs代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SQLtest
{
/// <summary>
/// A class that constains our form
/// </summary>
public partial class Form1 : Form
{
    // variables
    DBconnection objConnect;
    string conString;
    DataSet ds;
    DataRow dr;
    int maxRows;
    int inc = 0;

    /// <summary>
    /// Constructor of the class
    /// </summary>
    public Form1()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Form initialization method
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            objConnect = new DBconnection();
            conString = Properties.Settings.Default.TestConnectionString;

            objConnect.connection_string = conString;
            objConnect.Sql = Properties.Settings.Default.SQL;

            ds = objConnect.GetConnection;

            maxRows = ds.Tables[0].Rows.Count;
            // MessageBox.Show("Max Rows: " + maxRows);

            NavigateRecords();
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message);
        }
    }

    // DB Navigation Methods

    /// <summary>
    /// Sets pointer (inc) to last row
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnNext_Click(object sender, EventArgs e)
    {
        // prevent indexOutOfBounds error
        if (inc != maxRows - 1)
        {
            inc++;
            NavigateRecords();
        }
        else
        {
            MessageBox.Show("Reached last employee. Showing the first record.");
            inc = 0;
            NavigateRecords();
        }

    }

    /// <summary>
    /// Sets pointer (inc) to previous row (if possible)
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnPrevious_Click(object sender, EventArgs e)
    {
        // prevent indexOutOfBounds error
        if (inc != 0)
        {
            inc--;
            NavigateRecords();
        }
        else
        {
            MessageBox.Show("Reached first employee. Showing the last record.");
            inc = maxRows - 1;
            NavigateRecords();
        }
    }

    /// <summary>
    /// Sets pointer (inc) to first row
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnFirst_Click(object sender, EventArgs e)
    {
        if (inc != 0)
        {
            inc = 0;
            NavigateRecords();
        }
        else
        {
            MessageBox.Show("Already on first employee.");
        }
    }

    /// <summary>
    /// Sets pointer (inc) to last row
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnLast_Click(object sender, EventArgs e)
    {
        if (inc != maxRows - 1)
        {
            inc = maxRows - 1;
            NavigateRecords();
        }
        else
        {
            MessageBox.Show("Already on last employee.");
        }
    }

    /// <summary>
    /// Main Navigation Method
    /// </summary>
    private void NavigateRecords()
    {
        dr = ds.Tables[0].Rows[inc];

        txtFirstName.Text = dr.ItemArray.GetValue(1).ToString();
        txtLastName.Text = dr.ItemArray.GetValue(2).ToString();
        txtJobTitle.Text = dr.ItemArray.GetValue(3).ToString();
        txtDepartment.Text = dr.ItemArray.GetValue(4).ToString();
    }

    /// <summary>
    /// Exit button handler
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnExit_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    /// <summary>
    /// Add new record Button. Simply clears text fields, ready for a new record to be added.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnAddNew_Click(object sender, EventArgs e)
    {
        txtFirstName.Clear();
        txtLastName.Clear();
        txtJobTitle.Clear();
        txtDepartment.Clear();

        btnAddNew.Enabled = false;
        btnSave.Enabled = true;
        btnCancel.Enabled = true;
    }

    /// <summary>
    /// Save a new record button
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnSave_Click(object sender, EventArgs e)
    {
        DataRow newRow = ds.Tables[0].NewRow();

        // newRow[0] is the id, thus its filled automatically
        newRow[1] = txtFirstName.Text;
        newRow[2] = txtLastName.Text;
        newRow[3] = txtJobTitle.Text;
        newRow[4] = txtDepartment.Text;

        ds.Tables[0].Rows.Add(newRow);

        try
        {
            objConnect.UpdateDB(ds);
            maxRows++;
            inc = maxRows - 1;

            MessageBox.Show("DB updated successfully");
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message);
        }

        btnAddNew.Enabled = true;
        btnSave.Enabled = false;
        btnCancel.Enabled = false;
    }

    /// <summary>
    /// Cancel new record button. Simply call NavigateRecords() method, and restores buttons.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnCancel_Click(object sender, EventArgs e)
    {
        NavigateRecords();

        btnAddNew.Enabled = true;
        btnSave.Enabled = false;
        btnCancel.Enabled = false;
    }

}
}

这是DBconnection.cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQLtest
{
/// <summary>
/// A class that makes the connection to the SQL Database
/// </summary>
class DBconnection
{
    // variables
    private string sql_string;
    private string strCon;
    System.Data.SqlClient.SqlDataAdapter da_1;

    // set methods
    public string Sql
    {
        set { sql_string = value; }
    }

    public string connection_string
    {
        set { strCon = value; }
    }

    // DataSet
    public System.Data.DataSet GetConnection
    {
        get { return MyDataSet(); }
    }

    // MyDataSet method
    private System.Data.DataSet MyDataSet()
    {
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strCon);
        con.Open();

        da_1 = new System.Data.SqlClient.SqlDataAdapter(sql_string, con);

        System.Data.DataSet dat_set = new System.Data.DataSet();
        da_1.Fill(dat_set,"Table_Data_1");

        con.Close();

        return dat_set;
    }

    // Update DB method
    public void UpdateDB(System.Data.DataSet ds)
    {
        System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(da_1);
        cb.DataAdapter.Update(ds.Tables[0]);
    }
}
}

编辑:

为了测试VS将DB.mdf复制到“ / bin / Debug”文件夹中,我添加了一条新记录,然后从服务器资源管理器中分离了DB,然后从“ / bin / Debug”文件夹中复制了DB.mdf并替换了主目录上的DB.mdf。项目文件夹。它证实了这可能是问题所在,因为现在我可以通过VS DB Designer看到新添加的记录。

现在,我只需要弄清楚如何在VS关闭时将对“ / bin / Debug”文件夹中的DB.mdf所做的更改更新到主项目DB.mdf。

BSG

请注意,运行程序会将数据库从根项目文件夹复制到Release或Debug文件夹,因此,每次运行程序时,都将使用数据库的新副本。这意味着您对数据库所做的任何修改将在下次运行应用程序时被覆盖并被丢弃。当您只是在开发应用程序时,这很好。如果您不希望出现这种情况,请在“解决方案资源管理器”中选择数据库文件(.mdf),然后在“属性”窗口中找到“复制到输出目录”选项。将其值更改为Copy(如果较新)。现在,仅当项目的根目录中的数据库文件是输出目录中已有的较新版本时,才将其复制。

显然,当您第一次创建解决方案/项目数据库时,它是在项目的父目录中创建的。之后,当您构建/调试解决方案时,它将数据库添加到Bin / Debug目录中。调试时对数据所做的任何更改都在Debug数据库中进行。但是,每次在VS中运行应用程序时,它都会从父目录中提取数据,而该父目录从未收到您在调试时所做的更改,因为这些更改实际上是在Debug数据库中进行的。

解决方案:

  • 在数据库浏览器中
  • 右键单击数据库
  • 选择修改连接
  • 高级选项
  • 搜索属性AttachDbFileName
  • 将其从调试文件夹c:... \ bin \ debug \ DB.mdf更改为DB
  • 将数据库指向Debug目录后,在VS Server Explorer中,可以在解决方案资源管理器中删除该数据库,并且所有更新都将在Debug数据库中传输。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重新启动后符号链接消失

来自分类Dev

重新启动后Linux RAID消失

来自分类Dev

重新启动后,SimpleXML模块消失

来自分类Dev

重新启动后,图标从启动器中消失

来自分类Dev

重新启动/升级后,符号链接消失了

来自分类Dev

重新启动后,字体从Word中消失

来自分类Dev

重新启动后RAID5消失

来自分类Dev

重新启动后2e显示消失

来自分类Dev

mdadm RAID使重新启动后LVM消失

来自分类Dev

重新启动后,mdadm RAID阵列已消失

来自分类Dev

重塑并重新启动后,mdadm RAID阵列消失了

来自分类Dev

重新启动应用程序后,SQLite 数据消失了

来自分类Dev

更改配置文件后重新启动或不重新启动

来自分类Dev

更改配置文件后重新启动或不重新启动

来自分类Dev

重新启动之前,新HD的路径正确,重新启动后,名称已更改

来自分类Dev

更改datadir后无法重新启动mysql

来自分类Dev

重新启动后命令提示符更改

来自分类Dev

重新启动后获取更改的Linux系统UUID

来自分类Dev

更改configMap后重新启动kubernetes部署

来自分类Dev

每次重新启动后都会更改Sysctl参数

来自分类Dev

重新启动后获取更改的Linux系统UUID

来自分类Dev

重新启动后EDITOR环境变量的更改

来自分类Dev

重新启动Virtual Box后如何获得新的更改?

来自分类Dev

SSD上的文件消失,重新启动后重新出现

来自分类Dev

与NetworkManager创建团队连接后,重新启动后消失,结果奇怪

来自分类Dev

重新启动终端时,PATH消失

来自分类Dev

更新后重新启动

来自分类Dev

N后重新启动T-SQL行号

来自分类Dev

从检查点重新启动后,Spark Streaming选项卡消失