我有一个数据表,并且通过添加新列名作为MASKEDSSN来掩盖一列。 它已被掩盖。但我需要删除旧列名称SSN。删除时,将引发错误
无法删除此列,因为它是表达式的一部分: MaskedSSN ='XXX-XX-'+ SUBSTRING(CONVERT(SSN,System.String),6,4)。
代码:
DataTable employeeTable = new DataTable();
employeeTable.Rows.Add("123455789");
employeeTable.Rows.Add("123447789");
employeeTable.Rows.Add("823456719");
employeeTable.Columns.Add("SSN");
int index = employeeTable.Columns["SSN"].Ordinal;
employeeTable.Columns.Add("MaskedSSN", typeof(string));
employeeTable.Columns["MaskedSSN"].Expression = "'XXX-XX-
'+SUBSTRING(CONVERT(SSN, System.String),6,4)";
DataTable newsss = new DataTable();
newsss = employeeTable.Copy();
newsss.AcceptChanges();
newsss.Columns.RemoveAt(index);
newsss.Columns.Remove("SSN");
答案 0 :(得分:1)
您正在使用Expression语法来构建MaskedSSN
employeeTable.Columns["MaskedSSN"].Expression = "'XXX-XX-
'+SUBSTRING(CONVERT(SSN, System.String),6,4)";
如果使用AddRow手动进行屏蔽,则可以删除旧的SSN列。
修改
Func<string, string> MaskingFnc = (string ssnParam) => string.Format("XXX-XX-{0}", ssnParam.Substring(4,6));
DataTable employeeTable = new DataTable();
employeeTable.Columns.Add("SSN")
employeeTable.Columns.Add("SSNMasked")
employeeTable.Rows.Add("123455789", MaskingFnc("123455789"));
employeeTable.Rows.Add("123447789", MaskingFnc("123447789"));
employeeTable.Rows.Add("823456719", MaskingFnc("823456719"));
答案 1 :(得分:0)
表达式或计算列依赖于源列中的数据,因为它引用数据,所以它不会复制数据然后将其屏蔽。
因此,如果您的原始列数据发生更改,则新列将自动具有相同的值。
了解此依赖性后,您将意识到不能仅删除源列,因为如果这样做,则会发生空引用异常。可以将其视为Excel电子表格。 A列具有一个值,B列使用A列的值来确定百分比(或以货币格式显示)。如果删除列A,列B将立即收到错误(#REF!之类的东西)
您对CodeProject的问题有更多详细信息,也可以在StackOverflow上找到:https://www.codeproject.com/Questions/1272445/Cannot-remove-this-column-because-it-is-part-of-an
在此处,您显示您尝试复制表,然后从表中删除该列,同时仍保留该表达式,这将导致错误。
希望我的解释强调了列与计算列/表达式之间的依赖关系。
我建议在前端格式化数据(这就是我们拥有前端的原因),或者,如果它是API的一部分,则在SQL输出中对其进行格式化。
也可以屏蔽任何输入,以便在必须从任何地方读出数据之前正确插入数据。
您可以使用string.Format
进行手动遮罩(请注意,以下内容可能无法编译,我留给您找出答案)
string result = string.Format("XXX-XX-{0}", SSNColumnValue.Substring(4,6));
希望这可以指导您正确的方向