DataTable.Load,一或多个行包含违反非空,唯一或外键约束的值

1.4*_*4mb 3 c# .net-4.0

我进行了很多搜索,但找不到解决方案。

我得到错误:

无法启用约束。一或多个行包含违反非null,唯一或外键约束的值。

我运行DataTable.GetErrors(),发现Not NULL在SQL Compact Edition数据库中将某些列设置为。这些列用于LEFT OUTER JOIN查询中,因此在运行查询时它们为null。(当我在VS的Server Explorer中运行查询时,可以得到结果)。尝试在数据表中加载数据时发生错误:

using (SqlCeCommand Cmd = new SqlCeCommand("Query HERE", "Connection HERE"))
                {
                    C.Open();
                    using (SqlCeDataReader Rdr = Cmd.ExecuteReader())
                    {
                        DataTable DT = new DataTable();
                        DT.Load(Rdr);
                        return DT;
                    }
                }
Run Code Online (Sandbox Code Playgroud)

我尝试了许多解决方案来克服此问题,但是我无法解决它。我知道“ EnforceConstraints”,但是由于我不使用任何数据集,因此无法更改该属性。

1.4*_*4mb 5

我设法通过获取表的架构,遍历架构表的行(实际表的列)并创建与架构列具有相同属性的列来解决了这一问题(唯一的区别是将新列的AllowDBNull设置为true和Unique,将AutoIncrement设置为false),最后将新列添加到新的数据表中,该数据表稍后将用我们实际表中的数据填充(通过DataReader的帮助仅获取数据而不是架构)。

这是代码:

using (SqlCeConnection C = new SqlCeConnection(DBStr))
            using (Cmd)
            {   //using SqlCeCommand
                Cmd.Connection = C;
                C.Open();
                using (SqlCeDataReader Rdr = Cmd.ExecuteReader())
                {
                    //Create datatable to hold schema and data seperately
                    //Get schema of our actual table
                    DataTable DTSchema = Rdr.GetSchemaTable();
                    DataTable DT = new DataTable();
                    if (DTSchema != null)
                        if (DTSchema.Rows.Count > 0)
                            for (int i = 0; i < DTSchema.Rows.Count; i++)
                            {
                                //Create new column for each row in schema table
                                //Set properties that are causing errors and add it to our datatable
                                //Rows in schema table are filled with information of columns in our actual table
                                DataColumn Col = new DataColumn(DTSchema.Rows[i]["ColumnName"].ToString(), (Type)DTSchema.Rows[i]["DataType"]);
                                Col.AllowDBNull = true;
                                Col.Unique = false;
                                Col.AutoIncrement = false;
                                DT.Columns.Add(Col);
                            }

                    while (Rdr.Read())
                    {
                        //Read data and fill it to our datatable
                        DataRow Row = DT.NewRow();
                        for (int i = 0; i < DT.Columns.Count; i++)
                        {
                            Row[i] = Rdr[i];
                        }
                        DT.Rows.Add(Row);
                    }
                    //This is our datatable filled with data
                    return DT;
                }
            }
Run Code Online (Sandbox Code Playgroud)