Member 8478234 Ответов: 3

Как создать SQL-запрос из списка элементов


Моя цель - создать запрос из списка, где список содержит имя столбца и данные.

Ниже приведен мой список. Имя заголовка списка - [Data, DataColumnType]
["ABC", " StringColumn1"]
["XYZ", " StringColumn2"]
["12.07.2017", " DataColumn1"]
["INR", " StringColumn3"]
["1000", " FloatColumn1"]

Мне нужно построить запрос из списка, как показано ниже
string sqlquery = " вставить в tablename (StringColumn1,StringColumn2,DataColumn1,StringColumn3,FloatColumn1) значения ('ABC', 'XYZ', '12.07.2017', 'INR', 1000)

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

заранее спасибо.

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

List<dataitems> lst = new List<dataitems>();
            DataItems dt = new DataItems();
            dt.Data = "ABC";dt.DataColumn = "StringColumn1";
            dt.Data = "XYZ"; dt.DataColumn = "StringColumn2";
            dt.Data = "12/01/2017"; dt.DataColumn = "DateColumn1";
            lst.Add(dt);

            string query = "INSERT INTO tableName";
            int i = 0;
            foreach(var l in lst)
            {
                // 
            }

3 Ответов

Рейтинг:
15

Karthik_Mahalingam

List<DataItems> lst = new List<DataItems>();
           lst.Add(new DataItems() { Data = "ABC", DataColumn = "StringColumn1" });
           lst.Add(new DataItems() { Data = "XYZ", DataColumn = "StringColumn2" });
           lst.Add(new DataItems() { Data = "12/07/2017", DataColumn = "DateColumn1" });
           lst.Add(new DataItems() { Data = "INR", DataColumn = "StringColumn3" });
           lst.Add(new DataItems() { Data = "1000", DataColumn = "FloatColumn1" });

           string query = "INSERT INTO tableName ({0}) values ({1})";
           List< string> columnNames= new List<string>();
           List< string> columnValues= new List<string>();

           SqlCommand cmd = new SqlCommand();
           foreach (var item in lst)
           {
               cmd.Parameters.Add("@" + item.DataColumn, item.Data);
               columnValues.Add("@" + item.DataColumn);
               columnNames.Add(item.DataColumn);
           }
           string cols = string.Join(",", columnNames);
           string datas = string.Join(",", columnValues);
           query = string.Format(query, cols, datas);


Рейтинг:
10

njammy

Вот работоспособное решение,которое вы можете попробовать и опробовать.
Он разбит таким образом, чтобы облегчить тестирование и повторное использование удобных функций строк и списков.

namespace ConsoleApp01
{
    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;

    public class Program
    {
        public static void Main()
        {
            List<DataItems> dataList1 = DataQuery1();
            string insertSQL = dataList1.GetInsertSQL("Table1");
            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.AddRange(dataList1.SQLParameters());

            Console.WriteLine(insertSQL);
            foreach (SqlParameter sqlP in cmd.Parameters)
            {
                string
                    paramName = sqlP.ParameterName,
                    paramValue = Convert.ToString(sqlP.Value);
                Console.WriteLine(paramName + ": " + paramValue);
            }
        }

        public static List<DataItems> DataQuery1()
        {
            return new List<DataItems>
            {
                new DataItems { Data = "ABC", DataColumn = "StringColumn1" },
                new DataItems { Data = "XYZ", DataColumn = "StringColumn2" },
                new DataItems { Data = "12/01/2017", DataColumn = "DateColumn1" }
            };
        }
    }

    public class DataItems
    {
        public string Data { get; set; }
        public string DataColumn { get; set; }
    }

    public static class DataItemsExtensions
    {
        public static SqlParameter[] SQLParameters(this List<DataItems> items)
        {
            return items.Select(x => new SqlParameter("@" + x.DataColumn, x.Data)).ToArray();
        }

        public static List<string> ColumnNames(this List<DataItems> items)
        {
            return items.Select(x => x.DataColumn).ToList();
        }

        public static List<string> ParameterNames(this SqlParameter[] items)
        {
            return items.Select(x => x.ParameterName).ToList();
        }

        public static string GetInsertSQL(this List<DataItems> items, string tableName)
        {
            string query = "INSERT INTO {0} ({1}) VALUES({2})";
            string columns = string.Join(",", items.ColumnNames());
            string values = string.Join(",", items.SQLParameters().ParameterNames());
            return string.Format(query, tableName, columns, values);
        }
    }
}


Рейтинг:
0

Garth J Lancaster

вам нужно использовать параметризованный оператор insert - прочтите это Дайте мне параметризованный SQL или дайте мне смерть[^]

SqlCommand command1 = new SqlCommand("INSERT INTO tablename VALUES(@StringColumn1, ...)", SQLConnection);

command1.Parameters.AddWithValue("@StringColumn1", "ABC");
...
command1.ExecuteNonQuery();


Каждый раз, когда вы вставляете строку данных iirc, вы выполняете команду command1. Reset () для сброса переменных, но, пожалуйста, посмотрите ее, это было давно