序列不包含任何元素

ssabc

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

我在VS 2017中使用EF6。

我之前没有问题就使用过这种逻辑,但是下面是代码:
C#:
        private void cmdAddData_Click(object sender, EventArgs e)
        {
            DataTable dt_TimeData = timeDataSet.Tables["TimeData"];
            var IDVal = from a in dt_TimeData.AsEnumerable()
                        where (a.Field<Int32>("ID") != null)
                        select (a.Field<Int32>("ID"));
            int idVal_Int = IDVal.Max() + 1;
                
            Add_dgvTime(idVal_Int);


        }

从下面的行为中,我们看不到数据,但是它在那里!

屏幕截图06-06-18 at 03.16 PM.PNG

数据库中有数据:
屏幕截图06-06-18 at 03.57 PM.PNG

我想念什么?

谢谢!
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,481
位置
悉尼,澳大利亚
编程经验
10+
这没有任何意义:
a.Field<Int32>("ID") != null

查看该代码的逻辑,您将从列中获取Int32值并将其与null进行比较。这是荒谬的,因为Int32是值类型,因此在任何情况下都不能为null。它也似乎是表格的主键,因此毫无意义。如果您实际上需要检查该列是否为NULL,则可以这样做:
!a.IsNull("ID")

这样做毫无意义,因为如果它是PK,那么它就不能为空(如果您已经正确配置了东西),那么它必须有一个值。

我想问一下您整体上在做什么。像这样自己计算PK很容易。 SQL Server支持身份和序列(在较新的版本中),因此您几乎可以肯定使用其中之一。通常,应该使用一个标识,并在保存时让数据库生成该值。然后,您的DataTable可以自动生成完全可用的临时值,并且在需要时可以在您保存时自动更新。世界各地成千上万的开发人员都以这种方式这样做而没有问题,您也应该这样做。如果在保存之前需要最终的PK值(可能会发生),则应在此处使用序列而不是标识。
 

ssabc

知名会员
已加入
2017年12月11日
留言内容
63
编程经验
10+
说得通。这是我在上一个问题中必须执行的操作,以获取数据,因为dgv必须提前填充,我也不知道为什么?

现在的问题在这张照片中,我似乎无法填写表格适配器。

屏幕截图06-07-18 at 09.28 AM.PNG

数据在这里:
屏幕快照06-07-18 at 09.31 AM.PNG

抱歉,您是这样的新手...

请让我知道我想念的东西。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,481
位置
悉尼,澳大利亚
编程经验
10+
您可以预先配置DataSet使其不强制执行约束,这将使您能够填充DataTable,然后检查数据以确定发生错误消息中提到的三种可能情况中的哪一种。我不会以为这是外键,因为您首先要填充父表,但是我不会以为它可以是其他两个表中的任何一个,除非您的DataSet架构与数据库模式。自生成数据集以来,您是否已对数据库进行过更改?如果是这样,则“数据源”窗口中工具栏上会有一个按钮,它将重新运行向导并从数据库中提取所有新的架构信息。

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

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,481
位置
悉尼,澳大利亚
编程经验
10+
强制约束设置为True时发生相同的错误!

当然有,因为这是默认设置。我说过不要执行约束。这将使您能够成功加载数据,以便检查数据并确定哪些数据违反了什么约束。错误消息告诉您这三种可能性是什么,因此很容易找到有问题的数据。您只需要在不可为空的列中查找空值,在必须为唯一的列中查找重复值,或者在父表的主键列之外的外键列中查找值,
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,481
位置
悉尼,澳大利亚
编程经验
10+
尝试调用GetData而不是Fill。这将返回不属于数据集的数据表,因此不受外键约束。这至少会让您知道其外键是否是问题所在。顺便说一句,您还没有更改表适配器的任何默认查询,对吗?
 
最佳 底部