Arturo Vianni Ответов: 1

Преобразование строк в столбце в новые столбцы с#


Привет, я пытаюсь сделать что-то вроде этого:
У меня есть контейнер имени таблицы, который по умолчанию имеет 2 столбца

Column[key] Column2
|-------------| силос1|
|-------------| силос2|
|-------------| силос3|
|-------------| силос4|
|-------------| силос5|


Я хочу, чтобы при нажатии кнопки Добавить новостные столбцы для каждой строки в столбце 2 и проверить, существуют ли столбцы уже.
Колонка[ключ] Колонка2 силос1 силос2 силос3 силос4 силос5
|-------------| силос1|
|-------------| силос2|
|-------------| силос3|
|-------------| силос4|
|-------------| силос5|

До сих пор для добавления новостных колонок я использую :



OleDbCommand cmd = new OleDbCommand("ALTER TABLE Container ADD COLUMN silos1 NUMBER", con);
cmd.ExecuteNonQuery();


Я использую datatable для заполнения datagridview
sda = new OleDbDataAdapter("Select * From Container  ", con);
            OleDbCommandBuilder cb = new OleDbCommandBuilder(sda);
           



            dt = new DataTable();
            sda.Fill(dt);

            dataGridView1.DataSource = dt;


Что я уже пробовал:

----------------------------------------------------------------

1 Ответов

Рейтинг:
11

Thomas Nielsen - getCore

Привет Артуро

Я бы не хотел, чтобы мой пользовательский интерфейс лично изменял структуру моей базы данных, но тогда это не вопрос, Ваше утверждение alter кажется неправильным, номер типа данных-это тип olap. В SQL вы можете выбрать int обычно или numeric или что-то в этом роде:
Типы данных (Transact-SQL) | Microsoft Docs[^]

затем вы должны подумать, можно ли обнулить поле, которое при динамическом добавлении в таблицу с данными является более или менее обязательным. Если вы не хотите, чтобы это было так, то после этого вы обновите таблицу с допустимыми значениями и измените ее, а не не разрешите.

Теперь мы получаем

От

OleDbCommand cmd = new OleDbCommand("ALTER TABLE Container ADD COLUMN silos1 NUMBER", con);
cmd.ExecuteNonQuery();

К
OleDbCommand cmd = new OleDbCommand("ALTER TABLE Container ADD COLUMN silos1 int null", con);
cmd.ExecuteNonQuery();

Не слишком уверенный в OleDbCommand, я лично всегда использую пространство имен System. Data.SqlClient и SqlCommand

О, вы используете MS Access, это навевает воспоминания. В этом случае изменение состоит в том, чтобы использовать числовое значение, и вы получите

К
OleDbCommand cmd = new OleDbCommand("ALTER TABLE Container ADD COLUMN silos1 numeric", con);
cmd.ExecuteNonQuery();

И вы не будете иметь, чтобы рассмотреть, если поле может быть обнулена

Затем чтобы добавить их динамически я бы предложил использовать datatable который вы заполняете в любом случае так как это довольно удобно

var dt = new DataTable();
            sda.Fill(dt);
            var nameOfList = new List<string>(dt.Columns.Count);
            foreach (DataColumn clmn in dt.Columns)
            {
                nameOfList.Add(clmn.Caption);
            }

            var toAddList = new List<string>();

            foreach(DataRow row in dt.Rows)
            {
                if (!nameOfList.Contains(row["Column[key]"]))
                {
                    toAddList.Add(row["Column[key]"].ToString());
                }
            }

            foreach(string nameOfKey in toAddList)
            {
                //TODO: Execute add column
            }


Arturo Vianni

Как преобразовать все строки в Conteiner в новые столбцы ?

Thomas Nielsen - getCore

Пожалуйста, смотрите обновленное предложение