Очень часто вставлять данные в БД в C# - PullRequest
0 голосов
/ 25 мая 2020

Есть ли способ часто сохранять / вставлять данные в базу данных? У меня есть список, который содержит 100 сведений о студентах, таких как имя, возраст, класс и т. Д. c. На самом деле эти данные поступают с другого веб-сайта, и я хочу сохранить эти записи на sql сервере 2012. SQLBulkCopy не подходит для этой проблемы.

Я использую запрос к базе данных, как показано ниже:

            using (SqlConnection conn = new SqlConnection(DBHelper.DBConnection))
             {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {                     
                    cmd.CommandText = "insert into tableA.....";
                    cmd.ExecuteNonQuery();
                }
                conn.Close();
             }

В настоящее время я делаю это так - я беру первую запись студента из списка [foreach (студент в списке)] и использую вышеуказанный запрос для сохранения каждого студента.

Если мы используем sql соединение часто открывается и закрывается, не возникнет ли в конечном итоге каких-либо проблем ???

Есть ли способ очень часто сохранять данные в базу данных ??

пожалуйста, помогите.

1 Ответ

0 голосов
/ 25 мая 2020

Если они у вас есть в списке, вы можете вставить их все в al oop, не закрывая соединение. Однако открытие и закрытие соединений с базой данных не вызовет никаких проблем, если закрытые соединения будут правильно удалены после того, как вы закончите с ними. Тем не менее, вы можете исследовать параллелизм для своего проекта, используя Parallel.ForEach: https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-write-a-simple-parallel-foreach-loop или https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.parallel.foreach?view=netcore-3.1. Для его использования требуется ссылка на System.Threading.Tasks.

EDIT: пример кода о том, как вы можете использовать Parallel.ForEach:

using System;
using System.Threading;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Collections.Concurrent;

namespace WindowsFormsApp12
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // define the concurrent collection we'll use to leverage parallelism
        private ConcurrentBag<Student> allStudents = new ConcurrentBag<Student>();

        private void button1_Click(object sender, EventArgs e)
        {
            foreach(Student s in GetStudents())
            {
                // populate the concurrent collection with the student object
                // depending on how your code works, you may be able to modify the method that gets the data
                // from the web services to return this kind of collection and avoid this step
                allStudents.Add(s);
            }
            new Thread(() =>
            {
                Task.Run(() =>
                {
                    // MaxDegreeOfParallelism can be adjusted to suit your needs. We address the current Student
                    // object on the thread with the object s
                    Parallel.ForEach(allStudents, new ParallelOptions { MaxDegreeOfParallelism = 5 }, (s) =>
                     {
                         using (SqlConnection con = GetConnection())
                         {
                             using (SqlCommand cmd = new SqlCommand())
                             {
                                 cmd.Connection = con;
                                 cmd.CommandText = "INSERT INTO tblStudents ...";
                                 con.Open();
                                 cmd.ExecuteNonQuery();
                                 con.Close();
                             }
                         }
                     });
                    // you may want to clear the allStudents collection here if your code runs through this
                    // operation several times in a day
                }).Wait();
            }).Start();

        }

        private SqlConnection GetConnection()
        {
            // return a SqlConnection object wiht an appropriate connection string
            return new SqlConnection();
        }

        private List<Student> GetStudents()
        {
            // do something to populate the list
            return new List<Student>();
        }
    }

    public class Student
    {
        // class definition for the student object type
        public string Name { get; set; }
        public int Age { get; set; }
        public string Class { get; set; }
    }
}
...