不使用EF6更新数据库

ssabc

知名会员
已加入
2017年12月11日
留言内容
63
编程经验
10+
您好:

我的问题是,使用下面的代码,我无法更新数据库。
我遇到以下异常,因为它遍历每个字段:

字段____必须是最大长度为____的字符串或数组类型。

根据我对数据库的了解,我们处于约束之内。我添加了修整,因为它看起来可能有一些空格要截断。

C#:
            // Get 数据库 Records
            string IDVal = dgvJobs.CurrentRow.Cells[0].Value.ToString();
            int IDVal_int = Int32.Parse(IDVal);


            // Update database Records
            using (var db_Jobs = new ResourcePlanningEntities())
            {
                var getJobRecord = db_Jobs.Jobs.FirstOrDefault(a => a.ID == IDVal_int);


                getJobRecord.Customer = cboCustomer.ToString().Trim();
                getJobRecord.City = cboCity.ToString().Trim();
                getJobRecord.State = cboState.ToString().Trim();
                getJobRecord.Country = txtCountry.ToString().Trim();
                getJobRecord.EngineerProjectLead = cboEngineerProjectLead.ToString().Trim();
                getJobRecord.ProjectManager = cboProjectManager.ToString().Trim();
                getJobRecord.ShipDate = Convert.ToDateTime(txtShipDate.Text);


                try
                {
                    db_Jobs.SaveChanges();


                }
                catch (System.Data.Entity.Validation.DbEntityValidationException ex)
                {
                    foreach (var entityValidationErrors in ex.EntityValidationErrors)
                    {
                        foreach (var validationError in entityValidationErrors.ValidationErrors)
                        {
                            MessageBox.Show("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);


                        }


                    }


                }


            }
 

ssabc

知名会员
已加入
2017年12月11日
留言内容
63
编程经验
10+
主键和空值问题?

再一次问好:

我已经稍微修改了代码。据我了解,这是数据库中不允许使用null的问题。因此,我尝试添加它们。问题是,ID也是主键,我需要在那里强制一个值,该值与IDVal_Int相同。

除了所有字符串值之外,我很难解释所有内容!甚至最后的日期值也将是一个问题。我一直在整理它。


C#:
            // Get 数据库 Records
            string IDVal = dgvJobs.CurrentRow.Cells[0].Value.ToString();
            int IDVal_int = Int32.Parse(IDVal);


            // Update database Records
            using (var db_Jobs = new ResourcePlanningEntities())
            {
                var getJobRecord = db_Jobs.Jobs.Where(a => a.ID == IDVal_int).FirstOrDefault();


                getJobRecord.ID = // 什么 do I put here??
                getJobRecord.ProjectNumber = txtProjectNumber.ToString().Trim();
                getJobRecord.Customer = cboCustomer.ToString().Trim();
                getJobRecord.City = cboCity.ToString().Trim();
                getJobRecord.State = cboState.ToString().Trim();
                getJobRecord.Country = txtCountry.ToString().Trim();
                getJobRecord.EngineerProjectLead = cboEngineerProjectLead.ToString().Trim();
                getJobRecord.ProjectManager = cboProjectManager.ToString().Trim();
                //getJobRecord.ShipDate = Convert.ToDateTime(txtShipDate.Text);


                db_Jobs.SaveChanges(); // Not saving the data!


            }
 

ssabc

知名会员
已加入
2017年12月11日
留言内容
63
编程经验
10+
好吧,所以我想了一点,但是我回到了最初的问题。

该数据库是否以某种方式仅在我的项目中只读?在哪里控制?

C#:
            // Get 数据库 Records
            string IDVal = dgvJobs.CurrentRow.Cells[0].Value.ToString();
            int IDVal_int = Int32.Parse(IDVal);


            // Update database Records
            using (var db_Jobs = new ResourcePlanningEntities())
            {
                var getJobRecord = db_Jobs.Jobs.Where(a => a.ID == IDVal_int).FirstOrDefault();


                getJobRecord.ID = IDVal_int;
                getJobRecord.ProjectNumber = txtProjectNumber.ToString().Trim();
                getJobRecord.Customer = cboCustomer.ToString().Trim();
                getJobRecord.City = cboCity.ToString().Trim();
                getJobRecord.State = cboState.ToString().Trim();
                getJobRecord.Country = txtCountry.ToString().Trim();
                getJobRecord.EngineerProjectLead = cboEngineerProjectLead.ToString().Trim();
                getJobRecord.ProjectManager = cboProjectManager.ToString().Trim();
                //getJobRecord.ShipDate = Convert.ToDateTime(txtShipDate.Text);
                
                // Write to 数据库
                db_Jobs.SaveChanges(); // Not saving the data!


            }
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,499
地点
悉尼,澳大利亚
编程经验
10+
您究竟如何确定未保存数据?如果调用SaveChanges,那么实际上只有三种可能的结果:

1.有要保存的更改,呼叫成功并保存更改。
2.呼叫成功,但是没有要保存的更改。
3.调用失败,并引发异常。

如果没有抛出异常,那么我看不到您有可能要保存更改,但不保存更改。一个常见的问题是人们正在使用本地数据库,即项目中的数据文件,而最终他们在错误的数据库中查找数据更改,因此认为自己没有被保存。如果您使用的是本地数据库,建议您阅读以下内容以了解如何进行管理:

//msdn.microsoft.com/en-us/library/ms246989.aspx
 

ssabc

知名会员
已加入
2017年12月11日
留言内容
63
编程经验
10+
jmc:

我不在这里处理本地数据库。尽管我的PC上有一个正在使用的SQL Express实例。我对您的本地定义的解释是这是我项目的艺术。

在下图中,我将STOCK的值更改为STOCK2。以某种方式,例外是违反了文件长度,而并非如此。这就是为什么我添加了所有装饰内容的原因。
屏幕截图04-23-18 at 09.25 AM.PNG

接下来,我添加一个城市和州,它也不喜欢。

屏幕截图04-23-18 at 09.29 AM.PNG

最后,这是我的数据库。

屏幕截图04-23-18 at 09.33 AM.PNG

我相信数据库正在连接并起作用,因为删除数据的字段非常有用。提醒一下,我正在使用ef6。

非常感谢!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,499
地点
悉尼,澳大利亚
编程经验
10+
首先,您没有提供很多信息。那里似乎也有两个独立的问题。第一个屏幕快照出现在显然绑定到DataTable的DataGridView中,如果使用EF,这似乎很奇怪。该错误消息引用的是Customer DataColumn的MaxLength属性,该属性可能与数据库中相应列的大小相同或不同。秒截图没有指定违反了哪个验证规则,因此它可能是也可能不是同一列,但是它确实指示您查看EntityValidationErrors属性以获取更多信息。你做完了吗?
 

ssabc

知名会员
已加入
2017年12月11日
留言内容
63
编程经验
10+
jmc:

1.我正在调整价值。长度为7个字符,db分配为30。这使我认为这是另一回事。

2.实体验证错误属性。不知道那是什么,但我会调查一下。

谢谢!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,499
地点
悉尼,澳大利亚
编程经验
10+
1.我正在调整价值。长度为7个字符,db分配为30。这使我认为这是另一回事。
你什么时候修剪它?我们可以确认的错误消息与文本长度有关,该错误消息正在网格中发生,与EF无关。
2.实体验证错误属性。不知道那是什么,但我会调查一下。
“例外助手”窗口具有“查看详细信息”链接,以便您可以查看例外的详细信息。基本上,这是一个用于例外的PropertyGrid,以便在那里可以访问EntityValidationErrors属性。最好总是阅读IDE所显示的所有内容,如果它提供了访问更多信息的权限,那么请充分利用该访问权限。

我刚刚仔细查看了您的代码,就可以看到问题所在。这完美地说明了为什么您需要实际调试代码而不仅仅是阅读代码。即使没有断点,您也可以将鼠标悬停在getJobRecord.Customer上,以查看它是否包含预期的内容。如果您这样做了,您会发现事实并非如此。您的记录属性都不会有,因为您为它们分配了错误的值。专注于“客户”属性,您具有:
getJobRecord.Customer = cboCustomer.ToString().Trim();

您正在ComboBox本身上调用ToString。那不会获取控件中包含的数据。您的TextBoxes也是如此。我不会告诉您将其更改为什么,因为如果您还不知道,这将是查找信息的好方法。您应该使用VS中的“帮助”菜单打开文档,然后阅读有关ComboBox控件和TextBox控件的信息,以查看它们拥有哪些成员,并弄清楚哪个成员将为您提供所需的数据。

您还应该学习如何尽快(而不是稍后)调试代码。从这里开始:

//msdn.microsoft.com/en-us/library/y740d9d3.aspx
 
最佳 底部