C# 无法将数据集更改保存到C-Visual Studio 2013中的数据库

C# 无法将数据集更改保存到C-Visual Studio 2013中的数据库,c#,database,visual-studio-2013,dataset,C#,Database,Visual Studio 2013,Dataset,[已解决] 解决方案:当您在VisualStudio中执行程序时,它不会将更改提交给数据库,而是使用一个副本。将程序部署到可执行文件时,此可执行文件能够永久修改数据库。希望这对任何人都有帮助: 正如我在这个问题中所说的,我无法将数据集的更改保存到数据库中。我试图遵循本教程,但也无法让它工作:程序编译并执行,但新数据没有提交到数据库。这是我在旅行社之后写的代码 //方法在我的注册窗口窗体中 public static SqlDataAdapter GetuserRecord() {

[已解决] 解决方案:当您在VisualStudio中执行程序时,它不会将更改提交给数据库,而是使用一个副本。将程序部署到可执行文件时,此可执行文件能够永久修改数据库。希望这对任何人都有帮助:

正如我在这个问题中所说的,我无法将数据集的更改保存到数据库中。我试图遵循本教程,但也无法让它工作:程序编译并执行,但新数据没有提交到数据库。这是我在旅行社之后写的代码

//方法在我的注册窗口窗体中

    public static SqlDataAdapter GetuserRecord()
    {
        SqlConnection connection = new SqlConnection("Data Source=(LocalDB)\\v11.0;AttachDbFilename=|DataDirectory|\\DatabaseJogo.mdf;Integrated Security=True");
        string query = "Select * from dbo.[user]";

        SqlCommand command = new SqlCommand(query, connection);
        connection.Open();
        SqlDataAdapter adp = new SqlDataAdapter(command);
        MessageBox.Show("CONNECTION SUCCESFUL");
        return adp;
    }
//单击“我的注册”按钮时:

            SqlDataAdapter adp = GetuserRecord();
            DataSet ds = new DataSet();

            adp.Fill(ds);

            DataRow newRow = ds.Tables[0].NewRow();
            newRow["login"] = loginText.Text.Trim();
            newRow["name"] = nameText.Text.Trim();
            newRow["age"] = int.Parse(ageText.Text.Trim());
            newRow["graphicsScore"] = trackBar1.Value;
            newRow["storyScore"] = trackBar2.Value;
            newRow["gameplayScore"] = trackBar3.Value;
            newRow["password"] = passwordText.Text.Trim();
            newRow["isAdmin"] = isAdmin.Checked;
            newRow["sex"] = sex.Text.Trim();

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

            SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adp);

            adp.UpdateCommand = commandBuilder.GetUpdateCommand(true);
            adp.InsertCommand = commandBuilder.GetInsertCommand(true);
            adp.DeleteCommand = commandBuilder.GetDeleteCommand(true);

            adp.Update(ds);
编辑:将代码更改为新代码,但问题仍然存在。如果您想看一看,这里是:

                //TRY 3 SQL
            //https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.commit(v=vs.110).aspx
            SqlConnection connection = new SqlConnection("Data Source=(LocalDB)\\v11.0;AttachDbFilename=|DataDirectory|\\DatabaseJogo.mdf;Integrated Security=True");
            connection.Open();

            SqlCommand command = connection.CreateCommand();
            SqlTransaction transaction;

            transaction = connection.BeginTransaction("SIGNUP");

            command.Connection = connection;
            command.Transaction = transaction;
            try
            {
                command.CommandText = "INSERT INTO [user] ([login], [name], [age], [graphicsScore], [storyScore], [gameplayScore], [password], [isAdmin], [sex]) VALUES (@login, @name, @age, @graphicsScore, @storyScore, @gameplayScore, @password, @isAdmin, @sex);";
                command.Parameters.Add("@login", SqlDbType.NChar, 50).Value = loginText.Text.Trim();
                command.Parameters.Add("@name", SqlDbType.NChar, 50).Value = nameText.Text.Trim();
                command.Parameters.Add("@age", SqlDbType.Int).Value = int.Parse(ageText.Text.Trim());
                command.Parameters.Add("@graphicsScore", SqlDbType.Int).Value = trackBar1.Value;
                command.Parameters.Add("@storyScore", SqlDbType.Int).Value = trackBar2.Value;
                command.Parameters.Add("@gameplayScore", SqlDbType.Int).Value = trackBar3.Value;
                command.Parameters.Add("@password", SqlDbType.NChar, 50).Value = passwordText.Text.Trim();
                command.Parameters.Add("@isAdmin", SqlDbType.Bit).Value = isAdmin.Checked;
                command.Parameters.Add("@sex", SqlDbType.NChar).Value = sex.Text.Trim();
                command.ExecuteNonQuery();

                transaction.Commit();
                MessageBox.Show("COMMITTED");
            }
            catch (Exception expt)
            {
                MessageBox.Show(expt.Message);
                try
                {
                    transaction.Rollback();
                }
                catch (Exception ex2)
                {
                    // This catch block will handle any errors that may have occurred 
                    // on the server that would cause the rollback to fail, such as 
                    // a closed connection.
                    MessageBox.Show("Rollback Exception Type: " + ex2.GetType());
                    MessageBox.Show("  Message: " + ex2.Message);
                }
            }
            //connection.UpdateDatabase(ds);

            connection.Close();

为了更新数据库上的数据,SqlDataAdapter需要设置其InsertCommand、UpdateCommand和DeleteCommand属性

因此,请尝试以下代码:

 ds.Tables[0].Rows.Add(newRow);
 SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adp);
 adp.DeleteCommand = commandBuilder.GetDeleteCommand(true);
 adp.UpdateCommand = commandBuilder.GetUpdateCommand(true);
 adp.InsertCommand = commandBuilder.GetInsertCommand(true);
 adp.Update(ds.Tables[0]);
 //connection.UpdateDatabase(ds);
 connection.Close();
编辑:
Update方法采用数据集和表的名称。我们的数据集是ds,这是我们在设置UpdateDatabase方法时传递给它的数据集。在一个点之后,您在数据集中键入一个表的名称。

我也在进行同样的操作: 我可以创建数据集,然后插入、更新和删除,然后显示更改的数据集的数据。正如数据集的所有更改所显示的那样,这是可行的。但是您可以一次又一次地运行它,因此:底层数据库中的数据不会更改

要么某个地方的最终提交丢失了,要么它就不能正常工作,因为这些方法不再是最新的,没有人关心。 真诚地
Andi

您是否给出了与数据库表列名newRow[login]-login类似的正确列名?这与表列名类似吗?。列名可能区分大小写,因此,请尝试给出准确的列名是的,我是prasy。我可以登录到我的帐户,并在使用此代码注册表单后,查看我在注册屏幕中输入的所有详细信息。唯一的问题是,一旦我关闭程序,新用户就会从数据库中删除。你能用try/catch块包装一下,看看你在那次更新中是否遇到异常吗?@ragerory用try{adp.Updateds.Tables[0];}catchException expt进行了尝试{MessageBox.Showexpt.Message;}没有抛出异常!没有解决整个问题。我使用内置表适配器的第一种方法与此例程的工作方式相同:数据保存到数据集,我可以访问插入数据集的新数据,但当我关闭程序时,新数据会被清理。谢谢!@RodrigoGuimarães:查看我的编辑。…您必须在Update方法中传递dataset表,我注意到的一件事是,在执行插入/删除/更新操作后,始终关闭连接。我尝试了,关闭了连接,并更改为adp.Updates.Tables[0],但问题仍然是一样的。再次感谢。命令connection.UpdateDatabaseds;不可用,我在Google上找不到任何相关信息。它属于哪个命名空间?@RodrigoGuimarães:很抱歉,这是复制粘贴错误,我的代码。忽略它。