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

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

问题描述:

[已解决] 解决方案:当您在Visual Studio中执行程序时,它不会将更改提交到数据库,而是可以工作与副本。将程序部署到可执行文件时,此可执行文件能够永久修改数据库。希望这可以帮助任何人:)无法将数据集更改保存到C#中的数据库 - Visual Studio 2013

正如我在这个问题HERE所说的,我无法将我的数据集的更改保存到我的数据库。我试图按照这个教程HERE,并不能让它工作:程序编译和执行,但新的数据没有提交给数据库。以下是我在继续写下的代码。

//方法内MY SIGN UP WINDOWS FORM

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(); 
+0

您是否正在给与列表名称类似的数据库表列名称newRow [“login”]' - 'login'-这与表列名称?类似。列名可能区分大小写,因此请尝试给出确切的列名 – prasy 2015-01-26 19:38:09

+0

是的,我是prasy。使用此代码注册表单后,我可以登录到我的帐户并查看我在注册屏幕上输入的所有详细信息。唯一的问题是,只要关闭程序,新用户将从数据库中删除。 – 2015-01-26 20:36:16

+0

您是否可以在try/catch块中进行封装以查看是否在该更新中发生异常? – ragerory 2015-01-26 21:30:26

为了Updateupdate数据库的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方法需要一个DataSet和表的名称。 DataSet对我们来说是ds,这是我们在设置它时传递给我们的UpdateDatabase方法的一个。在点后面,输入数据集中的表格名称。

+0

没有解决整个问题。第一种方法(使用内置的表格适配器)的工作方式与此例程的工作方式相同:数据保存到DataSet中,我可以访问插入到数据集中的新数据,但是当关闭程序时新的数据被清理。谢谢! – 2015-01-26 20:33:15

+0

@RodrigoGuimarães:看看我的编辑...你必须通过更新方法中的数据集表,我注意到的一件事是在执行插入/删除/更新操作后总是关闭连接。 – prasy 2015-01-26 20:54:34

+0

我试过了,关闭了连接,并改为adp.Update(ds.Tables [0]);但问题仍然是一样的。再次感谢。 – 2015-01-26 21:05:22

我正在通过相同的事情:
我可以创建数据集,然后插入,更新和删除,然后显示更改的数据集的数据。在数据集的所有更改显示的情况下,这种方式的效果如此。但是你可以一次又一次地运行,所以:底层数据库中的数据不会改变。

某个地方的某个最终提交丢失了,或者它不能正常工作,因为这些方法不再是当前没有人关心的。
Sincerly Andi