С# sqldataadapter datatablemapping

У меня есть запрос - "SELECT PK1 FROM users";

У меня также есть таблица данных с именем myTable с тремя полями типа int;

-----------
| myTable |
-----------
| field1  |
| field2  |
| field3  |
-----------

Для каждой строки, возвращаемой из моего запроса, я хотел бы поместить значение PK1 в поле2 в myTable, оставив поле1 и поле3 нулевым.

Вот пример кода, который я пробовал до сих пор, но, похоже, он не работает. Вместо этого поле PK1 добавляется в конец myTable как новое поле.

class Program
    {
        static void Main(string[] args)
        {
            string SQL = "SELECT PK1 FROM users";
            SqlConnection connection = new SqlConnection([my connection string]);
            DataTable myTable = new DataTable();
            SqlDataAdapter adapter = new SqlDataAdapter();

            adapter.SelectCommand = new SqlCommand(SQL, connection);
            myTable.Columns.Add("field1", typeof(Int32));
            myTable.Columns.Add("field2", typeof(Int32));
            myTable.Columns.Add("field3", typeof(Int32));
            DataTableMapping dataMapping = adapter.TableMappings.Add("myTable", "users");
            dataMapping.ColumnMappings.Add("PK1", "field2");

            adapter.Fill(myTable);

            foreach (DataRow row in myTable.Rows)
            {
                Console.WriteLine("------------");
                foreach (DataColumn column in myTable.Columns)
                {
                    Console.WriteLine(column.ColumnName + " : " + row[column]);
                }
            }


            Console.ReadKey();
        }
    }

Есть ли проблема в моем коде или есть другой способ сопоставления полей?

Это упрощенный пример для целей этого вопроса, поскольку такое сопоставление имен полей было бы идеальным, а не вставлять значение в заданную позицию.


person user469453    schedule 11.06.2012    source источник
comment
Сейчас 2012 год, почему вы используете DataTable?   -  person Michael Minton    schedule 11.06.2012
comment
Потому что я хотел бы иметь возможность хранить данные в памяти и манипулировать ими, прежде чем сохранять их во второй БД. У вас есть лучшее предложение?   -  person user469453    schedule 11.06.2012
comment
Я также должен добавить, что это мой первый проект на С#, поэтому любые советы/альтернативы более чем приветствуются, так как это будет для меня опытом обучения.   -  person user469453    schedule 11.06.2012
comment
Вы можете создать класс, который лучше представляет данные, которыми вы манипулируете, и использовать какой-либо тип ORM (NHibernate) для сохранения перемены.   -  person Michael Minton    schedule 11.06.2012
comment
Не могли бы вы привести пример того, как я буду создавать класс и объекты?   -  person user469453    schedule 11.06.2012
comment
Кроме того, не могли бы вы объяснить, почему этот подход лучше использования DataTable/почему мне не следует использовать DataTable?   -  person user469453    schedule 11.06.2012
comment
Краткий список плюсов и минусов DataTable см. в здесь.   -  person Michael Minton    schedule 11.06.2012


Ответы (2)


Я думаю, что если это ваше требование, то в этом подходе нет ничего плохого. Измените свой запрос на следующий, и вам не нужно сопоставление.

string SQL = "SELECT PK1 as field2 FROM users";
person Asif Mushtaq    schedule 11.06.2012
comment
Привет, Асиф, спасибо, однако проблема в том, что я хотел бы вставить значение PK1 в поле2. Однако мой код оставляет все три поля пустыми и добавляет новое поле PK1 в конец моей таблицы данных. - person user469453; 11.06.2012
comment
Спасибо Асиф - использование этого в качестве обходного пути будет отличным. Спасибо - person user469453; 12.06.2012

он добавляет столбец, потому что вы говорите об этом. Вы должны либо использовать функцию datamappingColumn, либо функцию table.column.add, но не обе, они избыточны и, вероятно, не нужны.

Итак, если вы покинете table.column.add()

Вот пример того, как вы могли бы «привязать» имена столбцов к столбцам, которые вы установили в таблице, вы указываете порядок, в котором вы хотите, чтобы они отображались, вы можете оставить их пустыми с помощью двойной кавычки или установить для них значение null с помощью используя НУЛЬ.

this.table.AutoSetDataBoundColumnHeaders = true; this.table.SetDataBinding (таблица, null, "PK1", null);

person Hituptony    schedule 11.06.2012
comment
DataTable, кажется, не имеет ни одного из этих методов? - person user469453; 11.06.2012