Member 11905879 Ответов: 1

Как создать таблицу SQL server с динамическим количеством столбцов из C#?


Привет, я разрабатываю прикладное программное обеспечение для автомобильной промышленности. я использую несколько просмотров datagridviews в своем графическом интерфейсе для отображения некоторых критических данных пользователю. В некоторых таблицах данных числовые столбцы фиксированы, поэтому у меня нет проблем с созданием динамической таблицы sql server с именами столбцов, такими же, как в datatable, и переносом табличных данных из C# в таблицу sql server.

В то время как в некоторых таблицах данных пользователь хочет добавить/удалить любое количество столбцов в соответствии со своими потребностями. Поэтому в таких случаях я не могу жестко закодировать динамическое создание таблицы sql server с фиксированным количеством столбцов. Я думаю через условие if, как

if(dataGridView1.Columns.Count == 2)
{
var commandStr = "If not exists (select name from sysobjects where name = 'DGV2') CREATE TABLE DGV2(" + dataGridView2.Columns[0].Name + " char(50)," + dataGridView2.Columns[1].Name + " char(50))";
}
if(dataGridView1.Columns.Count == 3)
{
....//add 3 number of columns
}


но я чувствую, что это затягивающий способ, и я должен ограничить пользователя от добавления coulmns за пределами определенного количества. Поэтому я хочу спросить ваши предложения о том, как преодолеть эту проблему? пожалуйста, помогите мне

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

string connectionString = @"Data Source=LENOVO-PC\SQLEXPRESS;Initial Catalog=TESTDB;Integrated Security=True";

            SqlConnection connection = new SqlConnection(connectionString);

            connection.Open();

            var commandStr = "If not exists (select name from sysobjects where name = 'DGV2') CREATE TABLE DGV2(" + dataGridView2.Columns[0].Name + " char(50)," + dataGridView2.Columns[1].Name + " char(50))";

            using (SqlCommand command = new SqlCommand(commandStr, connection))

            command.ExecuteNonQuery();

            connection.Close();


также я упомянул тему SQL pivot. Но это не то, что мне нужно.
http://stackoverflow.com/questions/12643117/dynamically-create-columns-sql

Garth J Lancaster

Я работал с некоторыми программами, и они всегда позволяли своим таблицам иметь определенное количество "пользовательских полей", так что у них было бы

user_int_1
user_int_2
...
user_text_1
user_text_2

и т. д. требуется до 5 или 10 полей каждого типа. Раньше я думал, что это так же уродливо, как грех, но по сравнению с ручной конкатенацией sql для создания "динамической" таблицы это просто находка-периодически, если пользователь мог сделать дело, схемы БД обновлялись, и некоторые поля user_ мигрировали в "стандартную схему".

Если бы я собирался сделать это по-вашему, я бы, скорее всего, построил процедуру, которая берет список/массив кортежей/структур, представляющих имя поля и тип данных, и итеративно строит оператор SQL create из этого списка

Member 11905879

Да, согласен. Будет лучше обойтись со структурами

1 Ответов

Рейтинг:
0

pilot13

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

private string GetColumnNames(DataTable dt)
        {
            string name = String.Empty;
            foreach (DataColumn dc in dt.Columns)
            {
                 name += dc.ColumnName + " NVARCHAR(50)"+", "; 
            }
            return name;

        }
        private void CreateTableFromDataTable(DataTable dt,string tablename,string columns)
        {
            string createString = "CREATE TABLE "+tablename+" ("+ columns+")"; //YOUR SQL COMMAND TO CREATE A TABLE                      
            SqlCommand create = new SqlCommand(createString, sqlconnection);
            sqlconnection.Open();            
            create.ExecuteNonQuery();
            sqlconnection.Close();

        }


Richard Deeming

Когда вы выполняете конкатенацию строк в цикле, лучше использовать класс StringBuilder[^].

И если имена столбцов и таблиц вводятся пользователем, вы, вероятно, захотите заключить их в квадратные скобки, просто на случай, если пользователь ввел что-то, что не является допустимым идентификатором SQL.