无法将数据集更改保存到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();
为了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方法的一个。在点后面,输入数据集中的表格名称。
没有解决整个问题。第一种方法(使用内置的表格适配器)的工作方式与此例程的工作方式相同:数据保存到DataSet中,我可以访问插入到数据集中的新数据,但是当关闭程序时新的数据被清理。谢谢! – 2015-01-26 20:33:15
@RodrigoGuimarães:看看我的编辑...你必须通过更新方法中的数据集表,我注意到的一件事是在执行插入/删除/更新操作后总是关闭连接。 – prasy 2015-01-26 20:54:34
我试过了,关闭了连接,并改为adp.Update(ds.Tables [0]);但问题仍然是一样的。再次感谢。 – 2015-01-26 21:05:22
我正在通过相同的事情:
我可以创建数据集,然后插入,更新和删除,然后显示更改的数据集的数据。在数据集的所有更改显示的情况下,这种方式的效果如此。但是你可以一次又一次地运行,所以:底层数据库中的数据不会改变。
某个地方的某个最终提交丢失了,或者它不能正常工作,因为这些方法不再是当前没有人关心的。
Sincerly Andi
您是否正在给与列表名称类似的数据库表列名称newRow [“login”]' - 'login'-这与表列名称?类似。列名可能区分大小写,因此请尝试给出确切的列名 – prasy 2015-01-26 19:38:09
是的,我是prasy。使用此代码注册表单后,我可以登录到我的帐户并查看我在注册屏幕上输入的所有详细信息。唯一的问题是,只要关闭程序,新用户将从数据库中删除。 – 2015-01-26 20:36:16
您是否可以在try/catch块中进行封装以查看是否在该更新中发生异常? – ragerory 2015-01-26 21:30:26