Как добавить данные двух столбцов для другого столбца, где эти два столбца являются типом строки?

У меня есть данные, и есть два столбца, которые являются типом строки, и я хочу добавить данные этих двух столбцов для другого столбца, как я могу это сделать?

Имя моего столбца содержит специальный символ, и я использовал "[" "]" для экранирования специального символа, а мои столбцы имеют десятичный тип, который я делаю

 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";, тогда выдается ошибка типа Невозможно установить свойство Expression из-за циклической ссылки в выражении. тогда каково решение тот ?


person Harikrishna    schedule 07.05.2010    source источник
comment
эта функция SERTAX определена в базе данных? Кстати, что касается DataTable, хотя он и имитирует некоторые функции Sql Server, он не имеет отношения к функциям/функциям Sql Server (или любой СУБД, если на то пошло). Функции DataTable не имеют отношения к базовой базе данных. Даже если ваша база данных имеет встроенную функцию SERTAX, она все равно не будет работать в выражении столбца.   -  person Michael Buen    schedule 07.05.2010
comment
Чтобы доказать, что функциональность выражения DataTable Column не имеет отношения к возможностям вашей базы данных, если вы используете Oracle или Postgres, попробуйте сделать: dt.Columns["Fullname"].Expression = "Lastname || ', ' || Firstname", это не сработает, вам все равно придется использовать + для конкатенации вместо ||   -  person Michael Buen    schedule 07.05.2010
comment
последняя ошибка (невозможно установить выражение... круговое..), вы не можете делать такие вещи. это похоже на то, что у вас есть формула в столбце B2 в Excel, и формула B2 + C2 невозможна. что вы можете сделать, это зациклить DataRow вашего DataTable. foreach(DataRow r in dt.Rows) r["A"] = r["A"] + r["B"] + r["c"];   -  person Michael Buen    schedule 07.05.2010
comment
@Micheal, даже если я скопирую столбец A и добавлю в эту таблицу данных как имя AAA, а после этого сделаю A = B + C + AAA, то также выдаст ту же ошибку.   -  person Harikrishna    schedule 07.05.2010
comment
@Micheal, как вы описали, foreach(DataRow r in dt.Rows) r["A"] = r["A"] + r["B"] + r["c"]; выдает синтаксическую ошибку.   -  person Harikrishna    schedule 07.05.2010
comment
попробуйте Console.WriteLine выражение, которое вы назначаете Expression, прежде чем назначать это выражение Expression   -  person Michael Buen    schedule 07.05.2010
comment
@Micheal, хорошо..Готово....БОЛЬШОЕ СПАСИБО ЗА ТАКОЙ БОЛЬШОЙ ОТВЕТ......И правда ты замечательный человек.....   -  person Harikrishna    schedule 08.05.2010
comment
@Harikrishna: Не за что. Кстати, это Майкл, а не Майкл. Майкл — одно из самых популярных имен в мире, но меня до сих пор удивляет, что некоторые люди до сих пор ошибаются в его написании ;-)   -  person Michael Buen    schedule 08.05.2010
comment
@Michael, хорошо .. Вы знаете о htmlagilitypack?   -  person Harikrishna    schedule 08.05.2010
comment
Это мое первое знакомство с HTML Agility Pack здесь, я никогда не слышал о нем раньше. Я прочитал это вчера, кажется, хороший кусок кода   -  person Michael Buen    schedule 08.05.2010
comment
@Michael, хорошо, друг, спасибо за помощь. Оставайтесь на связи. Спасибо.   -  person Harikrishna    schedule 08.05.2010


Ответы (2)


Использовать это:

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)"

      );

Просто измените System.Int32 на System.Decimal, если serviceTax и STT относятся к денежному типу.

person Michael Buen    schedule 07.05.2010
comment
@Michael Buen, будет ли это добавление или объединение двух строк? - person Harikrishna; 07.05.2010
comment
если какое-либо из полей является строкой, это приведет к конкатенации. но если они оба числа, это приведет к сложению - person Michael Buen; 07.05.2010
comment
@Micheal, эти два столбца имеют тип строки, а не int, и я не могу изменить их тип данных, потому что это дает ошибку, например, невозможно изменить тип данных после вставки данных. - person Harikrishna; 07.05.2010
comment
вот список возможных выражений msdn.microsoft.com/en-us/library/ - person Michael Buen; 07.05.2010
comment
@Micheal, я видел это, но не могу изменить тип данных столбцов. - person Harikrishna; 07.05.2010
comment
@Harikrishna: просто опустите dt.Columns.Add, назначьте выражение для выражения dt.Columns[yourExistingColumnHere] - person Michael Buen; 07.05.2010
comment
@Micheal, если вместо суммы + доплата я напишу dt.columns["Amount"].Caption+dt.columns["SurCharge"].Caption;, это выдаст ошибку. - person Harikrishna; 07.05.2010
comment
@Micheal, ошибка отсутствует оператор. - person Harikrishna; 07.05.2010
comment
@Harikrishna: вы не можете назначать заголовки столбцов, это решит проблемы во время компиляции. просто назначьте его как обычное выражение - person Michael Buen; 07.05.2010
comment
@Micheal, я должен сделать это, потому что я могу получить динамический доступ к имени столбца. - person Harikrishna; 07.05.2010
comment
@Harikrishna: но заголовок не целочисленный, а заголовок предназначен только для заголовка сетки данных. если вы хотите добиться добавления значений в существующий столбец, просто назначьте его выражению - person Michael Buen; 07.05.2010
comment
@Micheal, когда я использую только выражение, выдает ошибку, например, отсутствующий оператор. - person Harikrishna; 07.05.2010
comment
@Harikrishna: пожалуйста, задай свой вопрос, что ты сделал. дословно, чтобы я мог видеть намерение вашего кода - person Michael Buen; 07.05.2010
comment
@Harikrishna: кстати, что происходит, когда ты делаешь: dt.Columns["Total"].Expression = "CONVERT(Amount,System.Decimal) + CONVERT(Surcharge,System.Decimal)"; ? - person Michael Buen; 07.05.2010
comment
@Micheal, выдает ошибку типа The expression contains undefined function call SERTAX(). - person Harikrishna; 07.05.2010
comment
@Harikrishna: см. мой комментарий к вашему вопросу - person Michael Buen; 07.05.2010
comment
@Micheal, мои данные в таблице данных поступают из файла путем его анализа с помощью пакета гибкости html. - person Harikrishna; 07.05.2010
comment
@Harikrishna: хорошо, теперь я знаю. откуда берутся функции SERTAX и STT? если из вашего С#, просто измените назначение de.Row["brokerage"].Value. см. мой отредактированный ответ. ColumnChanging также срабатывает, даже когда вы добавляете строки в свой DataTable. - person Michael Buen; 07.05.2010
comment
@Micheal, вы имеете в виду это, когда я вставляю записи в таблицу данных? - person Harikrishna; 07.05.2010
comment
@Harikrishna: DataTable заполнена вами? или он просто возвращается из HTML Agility Pack? - person Michael Buen; 07.05.2010
comment
@Micheal, хорошо, я поставил условие, что если эти столбцы входят в таблицу, то она будет иметь тип int. Теперь имена моих столбцов назначаются строковой переменной, и я делаю как TableExtractedFromFile.Columns[brokerageClmnInCNote].Expression ="'"+serviceTaxClmnInCNote+"'+'"+STTClmnInCNote+"'"; Но проблема в том, что из-за строковой переменной она дает ошибку который не может преобразовать в int32. - person Harikrishna; 07.05.2010
comment
если ваш брокерageClmnInCNote имеет строковый тип. попробуй: .Expression = string.Format("CONVERT({0},System.String)", serviceTaxClmnInCNote + " + " + STTClmnInCNote) - person Michael Buen; 07.05.2010
comment
если все ваши столбцы строкового типа, я просто добавлю ответ в свое редактирование. проверьте мое редактирование позже - person Michael Buen; 07.05.2010
comment
@Micheal, имя столбца ServiceTax назначается переменной serviceTaxClmnInCNote, и этот столбец имеет тип int. И имя столбца STT назначается < b>STTClmnInCNote и тип int. - person Harikrishna; 07.05.2010
comment
@Micheal, я пробовал, как вы описали в своем отредактированном ответе, но выдает ошибку, например: Выражение содержит неопределенный вызов функции SERTAX(). - person Harikrishna; 07.05.2010
comment
serviceTaxClmnInCNote — это строковая переменная, в которой хранится SERTAX, являющийся именем столбца. - person Harikrishna; 07.05.2010
comment
если SERTAX является функцией C#, забыл Expression, он не может обрабатывать функции, которые не встроены в собственный язык Expression. используйте событие ColumnChanging. для проверки концептуального кода попробуйте работать поэтапно. во-первых, сделайте так, чтобы событие ColumnChanging присваивало значения вычисляемому столбцу следующим образом: de.Columns["result"].Value = 7 * 6. затем замените его один за другим вашим выражением/функциями - person Michael Buen; 07.05.2010
comment
@Micheal, имя столбца возвращается пакетом адаптивности html, и я сохранил это имя столбца в строковой переменной serviceTaxClmnInCNote. - person Harikrishna; 07.05.2010
comment
@Micheal, теперь это работает, но результатом является объединение строк, а не добавление. - person Harikrishna; 07.05.2010
comment
@Micheal, я знаю причину, по которой это не работает, потому что имя столбца содержит специальный символ. - person Harikrishna; 07.05.2010

Извлеките данные из двух столбцов и вызовите функцию объединения строк. Обратитесь по следующей ссылке

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

person Pavan Navali    schedule 07.05.2010
comment
@Pavan, мне нужно добавить данные двух столбцов, а не конкатировать. - person Harikrishna; 07.05.2010