无法删除此列,因为它是表达式的一部分

时间:2018-12-21 07:59:59

标签: c#

我有一个数据表,并且通过添加新列名作为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");

2 个答案:

答案 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));

希望这可以指导您正确的方向