2013-03-11 49 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

相關問題