2013-03-11 20 views
1

我在C#和Java中构建查询构建器模块,用户可以根据指定的连接表达式来连接表,例如[Table1].[ID] = [Table2].[ID]字段需要等同于什么标准?

用户可以修改连接表达式,并可以选择将Table1中的任何字段与Table2中的任何字段等同。

我想过检查列数据类型和长度是否相同,但例如可以将varchar(10)列与nchar(10)列连接起来。只要长度相同,就可以选择这些不同的数据类型。

因此,我应该在我的检查中指定哪些条件以查看用户选定的连接表达式是否有效?我不能单靠PK/FK限制。

该标准可以适用于C#或Java - 无所谓,因为一旦我有一个普遍的答案,我可以转换我的解决方案,以适应两者。

+0

您如何访问数据库?你甚至可以告诉你代码中的字段是什么类型的? – Bobson 2013-03-11 17:40:29

+0

@Bobson - 是的,这很容易做到。存在许多库以及对sys.INFORMATION_SCHEMA执行的SQL语句。这不是我要问的。 – 2013-03-11 17:41:55

+0

您可以使用'size(columnName)'来检查列的大小。如果这两个表的列的大小相同,则允许加入..ELSE闪烁一条错误消息。 – 2013-03-11 17:43:36

回答

1

我认为你最好的选择是简单地有硬编码集,然后检查两个字段是否在同一集合中,只有然后比较长度。

var TypeSets = new Dictionary<string, List<string>> { 
        { "string", new[] { "varchar", "nchar", "text" } }, 
        { "integer", new[] { "int", "smallint" } }, 
       }; 

然后:

if (TypeSets.Any(x => x.Value.Contains(fieldType1) && x.Value.Contains(fieldType2))) 
{ 
    // Check length of each field 
} 
else 
{ 
    return false; 
} 
+0

感谢您的建议。所以硬编码是要走的路?我唯一的问题就是数据类型不是很多,所以编译这样一个列表需要很长时间。 – 2013-03-11 17:55:27

+0

@DotNET - 我不知道这是最好的方式,但它可能是最安全的。另一种方法是尝试猜测什么是可转换的,这可能会导致问题出现。 – Bobson 2013-03-11 17:59:56

+0

感谢您的建议! +1 – 2013-03-11 18:00:27

2

联机丛书会给你的数据类型和可转换implicityl,必须显式转换并不能转换。搜索CAST和CONVERT(Transact-SQL)并向下滚动。

现在您应该可以构建某种规则引擎,从而可以编写规则。

+0

感谢您的信息+1 – 2013-03-11 19:04:53

相关问题