在Visual Studio / C#

时间:2015-05-06 08:54:52

标签: c# sql database linq linq-to-sql

我在Visual Studio中遇到此问题。我有一个基于服务的数据库 - KCSDatabase.mdf和其中的1个表 - 用户。我通过在UserDataClasses.cs的上下文中拖放表来使用它来创建它的LINQ类。我在数据库和UserDataClasses.cs中都有一个存储过程AddNewUser

对于连接,它使用App.config

中定义的连接字符串
connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\KCSDb.mdf;Integrated Security=True"

因此,当我提交一份包含注册用户数据的表单并调试应用程序时,数据库在插入后不会更新更改。

当我尝试在一个会话中使用唯一ID添加两行时 - 它会收到我因为主键(id)而无法插入的通知,并且不会在数据库中进行更改。但是,如果我在两个不同的时间进行 - 两次我启动应用程序并插入具有相同ID的用户,它不会通知我,也不会在数据库中进行更改。

有人说我在某处写入插入信息(在某个文件中,在关闭应用程序后销毁)但不插入数据库中。 这是我的表单的saveButtonClick事件的代码:

UserDataClassesDataContext dc = new UserDataClassesDataContext();

dc.AddNewUser(Convert.ToInt32(tbId.Text),
              tbFirstName.Text,
              tbMiddleName.Text,
              tbLastName.Text,
              tbMail.Text,
              tbUserName.Text,
              tbPassword.Text);
dc.SubmitChanges();

1 个答案:

答案 0 :(得分:0)

来自 MSDN

SaveChanges 在交易中运作。如果无法保留任何脏的ObjectStateEntry对象,SaveChanges将回滚该事务并抛出异常

SubmitChanges 启动一个事务,如果在执行SubmitChanges时发生异常,则会回滚。但是,这不会回滚内存中的更改或DataContext跟踪的更改;这些更改需要手动回滚。如果要丢弃内存中的更改,则可以从DataContext的新实例开始。

您需要调用 .SaveChanges()而不是 .SubmitChanges()

修改代码:

dc.UserDataClassesDataContext dc = new UserDataClassesDataContext();

dc.AddNewUser(Convert.ToInt32(tbId.Text),
          tbFirstName.Text,
          tbMiddleName.Text,
          tbLastName.Text,
          tbMail.Text,
          tbUserName.Text,
          tbPassword.Text);
dc.SaveChanges(); // Replace dc.SubmitChanges();