创建一个没有约束但包含所有数据的数据表



我需要什么

我想创建一个数据表,具有所有相同的数据,但没有与任何表相关的约束。我将在一堆表上执行INNER JOIN来合并我需要的所有数据。它是这样的:

  1. 有几个测试条目。每个都有一个TestStep的集合。总是有一个TestStep的集合每个测试。两个表的ID都不能为NULL。
  2. 可能有其他数据片段将同时连接到TestTestStep有时,TestTestParam将有一个集合将链接到每个Test的,但并非总是如此。TestParam有一个ID字段不能为NULL。
  3. 有时每个TestStep都有一组参数也有时不是。TestStepParam有一个ID字段不能为NULL。
  4. 有时会有截图TestStep。同样,有时也不是。有一个不能为NULL的ID字段。如果我执行SQL,在SQLite浏览器中连接所有这些表,并说没有任何屏幕截图连接到某个TestStep,那么它就会在单元格中输入NULL(SQL在下面键入)。如果我使用下面的代码做完全相同的事情,它会抛出一个异常。我如何使它忽略约束时,我使用DataTable.Load(SqLiteDataReader)?

WHAT I HAVE

下面是我从SQLite数据库中获取数据的方法,它工作得很好:

private static List<DataTable> HitDB(params string[] sqls)
{
List<DataTable> ldt = new List<DataTable>();
using (SqliteConnection cnn = new SqliteConnection(LoadConnectionString()))
{
cnn.Open();
foreach (string sql in sqls)
{
DataTable dt = new DataTable();
SqliteCommand cmd = new SqliteCommand(sql, cnn);
SqliteDataReader sqldr = cmd.ExecuteReader();
//this is what I would have hoped would have fixed this.
dt.Constraints.Clear();                    
try
{
//This is where the error is thrown.
dt.Load(sqldr);
}
catch (ConstraintException exc)
{
Wr.Err($"CONSTRAINT EXCEPTION CAUGHT: n{exc}nn");
}
catch (Exception exc)
{
Wr.Err($"EXCEPTION CAUGHT: {exc}nn");
}
ldt.Add(dt);
}
cnn.Close();
}
return ldt;
}
对于sql,我有:
string sql = $"SELECT * FROM Test t " +
$"INNER JOIN TestStep ts " +
$"ON t.ID = ts.Test_ID " +
$"LEFT OUTER JOIN Test_Param tp " +
$"ON t.ID = tp.Test_ID " +
$"LEFT OUTER JOIN TestStep_Param tsp " +
$"ON ts.ID = tsp.TestStep_ID " +
$"LEFT OUTER JOIN ScreenShot ss " +
$"ON ts.ID = ss.TestStep_ID "

这是当我在SQLite浏览器中输入它的结果,以及我想在c#中重新创建的:TABLE

WHAT I'VE try

我已经尝试执行dt.Constraints.Clear();之前加载在SqLiteDataReader但这改变不了什么。

CONSTRAINT EXCEPTION CAUGHT:
System.Data.ConstraintException: Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.
at System.Data.DataTable.EnableConstraints()
at System.Data.DataTable.set_EnforceConstraints(Boolean value)
at System.Data.DataTable.EndLoadData()
at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption)
at Automonom.AutoDB.HitDB(String sql) in C:VS ProjectsAutomonomAutoDB.cs:line 555

如果您真的想在数据库中存储测试,我建议您避免这样做,因为:

  1. 不支持版本控制

假设您的经理要求您测试新功能。这将包括:重构现有的测试,添加新的测试,删除过期的测试,记录测试的行为,将它们与一些任务跟踪器链接起来。你准备好支持所有这些案件了吗?

  1. 难以迁移

SQL很难修改:它会影响现有的数据表模式、查询。你确定你的模式每年改变一次吗?

  1. 复制粘贴问题

Tests是非常动态的结构,在这里和那里做一些微小的改变来复制粘贴test比扩展数据库模式更便宜。

  1. 团队开发/测试

如果您有多个特性,多个CI/CD管道,您如何运行您的新测试而不影响生产测试?你准备好面对开发人员可能为了所有人和生产而打破流水线的情况了吗?

只需将测试存储在文件中,在GIT中作为文档。

最新更新