【问题标题】:How to make addition of two columns data for another column where those two columns are type of string?如何为这两列是字符串类型的另一列添加两列数据?
【发布时间】:2011-02-16 17:22:20
【问题描述】:

我有数据表,有两列是字符串类型,我想为另一列添加这两列数据,我该怎么做?

我的列名包含特殊字符,我使用 "[" "]" 来转义特殊字符,我的列是我正在做的小数类型

 TableExtractedFromFile.Columns[TOT BROK(Rs)].Expression = 
                "'"+"["+SER TAX(Rs)+"]"+"'+'"+"["+STT(Rs)+"]"+"'";

但是 TOT BROK(Rs) 列包含 SER TAX(Rs) 和 STT(Rs) 列的值的连接。但我想要这两列值的总和。

编辑 有用。但是如果我喜欢有三列 A、B 和 C。现在如果我这样做 table.columns["A"].expression = "A+B+C"; 那么它会给出错误,例如 Cannot set Expression property due to circular reference in the expression. 那么什么是解决方案?

【问题讨论】:

  • SERTAX 函数是在数据库中定义的吗?顺便说一句,关于 DataTable,虽然它模仿了 Sql Server 的一些功能,但它与 Sql Server(或任何 RDBMS)功能/功能无关。 DataTable 功能与底层数据库无关。即使你的数据库有内置函数SERTAX,它仍然不能在Column的Expression中工作。
  • 为了证明DataTable Column的Expression功能和你的数据库能力没有关系,如果你用的是Oracle或者Postgres,尝试做:dt.Columns["Fullname"].Expression = "Lastname || ', ' || Firstname",这样不行,你还是要用@ 987654324@ 用于连接而不是 ||
  • 最后一个错误(不能设置表达式...循环...),你不能做那种事情。这就像你在Excel的B2列中有一个公式,而公式是B2 + C2,不可能。你可以做的是循环你的DataTable的DataRow。 foreach(DataRow r in dt.Rows) r["A"] = r["A"] + r["B"] + r["c"];
  • @Micheal,即使我复制列 A 并将其添加到该数据表中作为 AAA 的名称,然后我执行 A = B + C + AAA,它也会给出相同的错误。
  • @Micheal,正如你所描述的,foreach(DataRow r in dt.Rows) r["A"] = r["A"] + r["B"] + r["c"]; 给出了语法错误。

标签: c# winforms datatable datacolumn


【解决方案1】:

使用这个:

dt.Columns.Add("fullname", typeof(string));
dt.Columns["fullname"].Expression = "lastname + ', ' + firstname";

对于添加值(Total、Amount 和 Surcharge 是您现有的列,并且是类型字符串,您需要将 CONVERT 函数放在您的列名中,以便它们将被转换为十进制(System.Decimal),如果 int 使用 System .Int32 或 System.Int64 等):

dt.Columns["Total"].Expression = 
  "CONVERT(Amount,System.Decimal) + CONVERT(Surcharge,System.Decimal)";

[编辑]

只需在您的后端进行:

    select *, CONVERT(SERTAX(Rs), DECIMAL) 
        + CONVERT(STT(Rs), DECIMAL) AS brokerage 
    from tbl

如果您对数据库有控制权,请修改 SERTAX 和 STT 函数,使其可以返回小数/货币/整数,而不是字符串。

然后在你的前端,这样做:

dt.ColumnChanging += (ds, de) =>
{
    if (de.Column.ColumnName == "Rs")
    {
        decimal serTaxResult = (decimal)new SqlCommand("select SERTAX(" + de.ProposedValue + ")").ExecuteScalar();
        decimal sttResult = (decimal)new SqlCommand("select STT(" + de.ProposedValue + ")").ExecuteScalar();

        // if your SERTAX AND STT really return string, use this:                        
        // decimal serTaxResult = decimal.Parse( (string) new SqlCommand("select SERTAX(" + de.ProposedValue + ")").ExecuteScalar() );
        // decimal sttResult = decimal.Parse( (string) new SqlCommand("select STT(" + de.ProposedValue + ")").ExecuteScalar() );


        de.Row["brokerage"] = serTaxResult + sttResult;
    }
};

[编辑]

如果你所有的列都是字符串类型,你必须用它们自己的 CONVERT 将它们括起来。

.Expression = string.Format("CONVERT({0},System.String)", 

      "CONVERT(" + serviceTaxClmnInCNote  + ", System.Int32)"
      + " + " 
      + "CONVERT(" + STTClmnInCNote + ", System.Int32)"

      );

如果 serviceTax 和 STT 是货币类型,只需将 System.Int32 更改为 System.Decimal。

【讨论】:

  • @Michael Buen,这会添加或连接两个字符串吗?
  • 如果任何字段是字符串,它将导致连接。但如果它们都是数字,则会导致加法
  • @Micheal,这两列是字符串类型而不是 int,我无法更改它们的数据类型,因为它会给出错误,例如一旦插入数据就无法更改数据类型。
  • 这里是可能的表达式列表msdn.microsoft.com/en-us/library/…
  • @Micheal,我已经看到了,但无法更改列的数据类型。
【解决方案2】:

从两列中提取数据并调用字符串 concat 函数。参考以下链接

http://www.1keydata.com/sql/sql-concatenate.html

【讨论】:

  • @Pavan,我需要添加两列数据而不是 concat。
猜你喜欢
  • 1970-01-01
  • 2013-01-22
相关资源
最近更新 更多