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