当前位置:网站首页>Accès à la base de données SQL avec Multithreading, invoke et action

Accès à la base de données SQL avec Multithreading, invoke et action

2022-01-15 02:08:23 La lave de Rodinia

Configuration du profil

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<connectionStrings>
		<add name ="connString" connectionString="Server=.;DataBase=SMDB;Uid=sa;Pwd=sasa"/>
	</connectionStrings>
</configuration>

Définir les fonctions de l'outil

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.IO;

namespace SQLThreading
{
    
    public class Helper
    {
    
        private static string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();

        #region Format d'encapsulationSQLLes différentes méthodes d'exécution des déclarations

        public static int Update(string sql)
        {
    
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
    
                conn.Open();
                return cmd.ExecuteNonQuery();//Ajouter, supprimer et modifier
            }
            catch (Exception ex)
            {
    
                //Écrire des informations d'exception dans le journal
                //WriteLog(ex.Message);
                //throw new Exception("Appelezpublic static int Update(string sql)Erreur de méthode:" + ex.Message);
                string errorInfo = "Appelezpublic static int Update(string sql)Erreur de méthode:" + ex.Message;
                WriteLog(errorInfo);
                throw new Exception(errorInfo);
            }
            finally
            {
    
                conn.Close();
            }
        }
        public static object GetSingleResult(string sql)
        {
    
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
    
                conn.Open();
                return cmd.ExecuteScalar();
            }
            catch (Exception ex)
            {
    
                //Écrire des informations d'exception dans le journal 
                string errorInfo = "Appelezpublic static object GetSingleResult(string sql)Erreur de méthode:" + ex.Message;
                WriteLog(errorInfo);
                throw new Exception(errorInfo);
            }
            finally
            {
    
                conn.Close();
            }
        }
        public static SqlDataReader GetReader(string sql)
        {
    
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
    
                conn.Open();
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
    
                conn.Close();
                //Écrire des informations d'exception dans le journal 
                string errorInfo = "AppelezSqlDataReader GetReader(string sql)Erreur de méthode:" + ex.Message;
                WriteLog(errorInfo);
                throw new Exception(errorInfo);
            }
        }
        public static DataSet GetDataSet(string sql)
        {
    
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataAdapter da = new SqlDataAdapter(cmd);//Créer un objet adaptateur de données
            DataSet ds = new DataSet();//Créer un ensemble de données de mémoire
            try
            {
    
                conn.Open();
                da.Fill(ds);//Remplir l'ensemble de données avec un adaptateur de données
                return ds;
            }
            catch (Exception ex)
            {
    
                //Écrire des informations d'exception dans le journal 
                string errorInfo = "Appelez public static DataSet GetDataSet(string sql)Erreur de méthode:" + ex.Message;
                WriteLog(errorInfo);
                throw new Exception(errorInfo);
            }
            finally
            {
    
                conn.Close();
            }
        }
        public static bool UpdateByTran(List<string> sqlList)
        {
    
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            try
            {
    
                conn.Open();
                cmd.Transaction = conn.BeginTransaction();//Ouvrir la transaction 
                foreach (string sql in sqlList)
                {
    
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();
                }
                cmd.Transaction.Commit();//Soumettre une transaction
                return true;
            }
            catch (Exception ex)
            {
    
                if (cmd.Transaction != null)
                {
    
                    cmd.Transaction.Rollback();//Opérations de rollback
                }
                string errorInfo = "AppelezUpdateByTran(List<string> sqlList)Erreur de méthode:" + ex.Message;
                WriteLog(errorInfo);
                throw new Exception(errorInfo);
            }
            finally
            {
    
                if (cmd.Transaction != null)
                {
    
                    cmd.Transaction = null;//Vider la transaction
                }
                conn.Close();
            }
        }

        #endregion

        #region Autres méthodes

        private static void WriteLog(string log)
        {
    
            FileStream fs = new FileStream("sqlhelper.log", FileMode.Append);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine(DateTime.Now.ToString() + " " + log);
            sw.Close();
            fs.Close();
        }

        #endregion
    }
}
/* *1Ajouter 1.1【Insérer une seule ligne】 insert [into] <Nom du tableau> (Nom de la colonne) values (Valeur de colonne) Exemple:insert into Strdents (Nom,Sexe,Date de naissance) values (‘Heureux, mon ami.’,‘Hommes’,‘1980/6/15’) 1.2【 Ajouter des données de table existantes à une table existante 】 insert into <Nouveau tableau existant> (Nom de la colonne) select <Nom de colonne du tableau original> from <Ancien nom du tableau> Exemple:insert into tongxunlu (‘Nom’,‘Adresse’,‘E - mail’) select name,address,email from Strdents 2Supprimer 2.1【Supprimer<Si les conditions sont remplies>D'accord】 delete from <Nom du tableau> [where <Supprimer la condition>] Exemple:delete from a where name=‘Heureux, mon ami.’(Supprimer le tableauaLigne avec la valeur de la colonne moyenne comme bon ami) 2.2【Supprimer le tableau entier】 truncate table <Nom du tableau> truncate table tongxunlu Attention!:Supprimer toutes les lignes du tableau,Mais la structure de la table、Colonnes、Contraintes、Les index, etc., ne sont pas supprimés;Les tableaux avec des contraintes externes ne peuvent pas être utilisés 3Modifier update <Nom du tableau> set <Nom de la colonne=Mettre à jour les valeurs> [where <Conditions de mise à jour>] Exemple:update tongxunlu set Âge=18 where Nom=‘Petit nom bleu’ 4Regarde. 4.1``Précision(Conditions)Requête select <Nom de la colonne> from <Nom du tableau> [where <Test de représentation des critères de requête>] [order by <Nom de colonne trié>[ascOudesc]] 4.1.1【 Interroger toutes les lignes et colonnes de données 】 Exemple:select * from a Description:Requêtea Toutes les lignes et colonnes du tableau  4.1.2【 Ligne de requête partielle –Requête conditionnelle】 Exemple:select i,j,k from a where f=5 Description:Table de requêteaMoyennef=5Toutes les lignes de,Et montrei,j,k3Colonnes 4.1.3【Utiliser dans une requêteASModifier le nom de colonne】 Exemple:select name as Nom from a where xingbie=‘Hommes’ Description:Requêtea Toutes les lignes du tableau pour les hommes et les femmes ,AffichernameColonnes,Et vanameLa colonne a été rebaptisée(Nom)Afficher 4.1.4【 Recherche de lignes vides 】 Exemple:select name from a where email is null Description:Table de requêteaMoyenneemail Toutes les lignes vides ,Et montrenameColonnes;SQLUtilisezis nullOuis not null Pour déterminer s'il s'agit d'une ligne vide  4.1.5【 Utiliser des constantes dans la requête 】 Exemple:select name, ‘Tangshan’ as Adresse from Student Description:Table de requêtea,AffichernameColonnes, Et ajouter une colonne d'adresse , Les valeurs des colonnes sont ’Tangshan’ 4.1.6【 La requête renvoie un nombre limité de lignes (Mots clés:top percent)】 Exemple1:select top 6 name from a Description:Table de requêtea,Afficher les colonnesnameAvant6D'accord,topPour les mots clés Exemple2:select top 60 percent name from a Description:Table de requêtea,Afficher les colonnesnameDe60%,percentPour les mots clés 4.1.7【Tri des requêtes(Mots clés:order by , asc , desc)】 Exemple:select name from a where chengji>=60 order by desc Description:RequêteaDans le tableauchengjiSupérieur ou égal à60Toutes les lignes de, Et afficher par ordre décroissant nameColonnes;Par défautASCOrdre croissant 4.2``Requête floue 4.2.1【UtiliserlikeFaire une requête floue】 Attention!:like Les paires d'opérations ne sont utilisées que pour les chaînes , Donc seulement avec charEtvarchar Utilisation conjointe des types de données  Exemple:select * from a where name like ‘Zhao!%’ Description: Table d'affichage de la requête aMoyenne,name Champ le premier mot est l'enregistrement de Zhao  4.2.2【Utiliserbetween Recherche dans une certaine mesure 】 Exemple:select * from a where nianling between 18 and 20 Description: Table d'affichage de la requête aMoyennenianlingIn18À20Entre les enregistrements 4.2.3【Utiliserin Requête dans les valeurs énumérées 】 Exemple:select name from a where address in (‘Beijing’,‘Shanghai’,‘Tangshan’) Description:Table de requêteaMoyenneaddress Valeurs enregistrées à Pékin, Shanghai ou Tangshan ,AffichernameChamp 4.3``.Requête de groupe 4.3.1【Utilisergroup byEffectuer une requête de groupe】 Exemple:select studentID as Numéro de l'étudiant,AVG(score) as Moyenne (Notes:Ici.scoreEst un nom de colonne) from score (Notes:Ici.scoreC'est le nom de la table.) group by studentID Description:Dans le tableauscoreRequête moyenne,Appuyez.strdentIDRegroupement des champs,AfficherstrdentIDChamps etscoreMoyenne des champs;select Une expression dans une instruction qui ne permet que les colonnes groupées et une valeur retournée pour chaque groupe , Par exemple, une fonction d'agrégation avec un nom de colonne comme paramètre  4.3.2【Utiliserhaving Clause pour le filtrage de groupe 】 Exemple:select studentID as Numéro de l'étudiant,AVG(score) as Moyenne (Notes:Ici.scoreEst un nom de colonne) from score (Notes:Ici.scoreC'est le nom de la table.) group by studentID having count(score)>1 Description:Suite à l'exemple ci - dessus,Après l'affichage du Groupecount(score)>1Oui.,Parce quewhere Ne peut être utilisé que s'il n'y a pas de groupe , Seuls les having Pour limiter les conditions . 4.4``. Requête de jointure Multi - tables  4.4.1Connexion interne 4.4.1.1【Inwhere Spécifiez les conditions de jointure dans la clause 】 Exemple:select a.name,b.chengji from a,b where a.name=b.name Description:Table de requêteaEt tableauxbMoyennename Enregistrements avec des champs égaux , Et montre le tableau aDansname Champs et tableaux bDanschengjiChamp 4.4.1.2【InfromUtilisé dans la clausejoin…on】 Exemple:select a.name,b.chengji from a inner join b on (a.name=b.name) Description:Ibid. inner join(Connexion équivalente) .Renvoie seulement les lignes avec des champs liés égaux dans les deux tableaux left join(Connexion gauche) .Renvoie les enregistrements qui contiennent tous les enregistrements dans le tableau de gauche et les enregistrements qui ont des champs liés égaux dans le tableau de droite right join(Connexion droite) Renvoie les enregistrements qui contiennent tous les enregistrements dans le tableau de droite et les enregistrements qui ont des champs liés égaux dans le tableau de gauche INNER JOIN Syntaxe: select Students.StudentId,StudentName,ClassName,CSharp,SQLServerDB from Students //DeStudentsTableau  Il y a des colonnes dedans.  Mettez le tableauStudentClass Et tableauxScoreList  Grâce à la clé et  Students Connecté inner join StudentClass on StudentClass.ClassId=Students.ClassId inner join ScoreList on ScoreList.StudentId=Students.StudentId INNER JOIN Utilisation de la connexion de deux tables de données: SELECT * FROM Tableau1 INNER JOIN Tableau2 ON Tableau1.Champ no=Tableau2.Champ no INNER JOIN  Utilisation de la connexion de trois tableaux de données : SELECT * FROM (Tableau1 INNER JOIN Tableau2 ON Tableau1.Champ no=Tableau2.Champ no) INNER JOIN Tableau3 ON Tableau1.Champ no=Tableau3.Champ no INNER JOIN  Utilisation de la connexion de quatre tableaux de données : SELECT * FROM ((Tableau1 INNER JOIN Tableau2 ON Tableau1.Champ no=Tableau2.Champ no) INNER JOIN Tableau3 ON Tableau1.Champ no=Tableau3.Champ no) INNER JOIN Tableau4 ON Member.Champ no=Tableau4.Champ no INNER JOIN  Utilisation de la connexion de cinq tableaux de données : SELECT * FROM (((Tableau1 INNER JOIN Tableau2 ON Tableau1.Champ no=Tableau2.Champ no) INNER JOIN Tableau3 ON Tableau1.Champ no=Tableau3.Champ no) INNER JOIN Tableau4 ON Member.Champ no=Tableau4.Champ no) INNER JOIN Tableau5 ON Member.Champ no=Tableau5.Champ no */

ÉtablissementwinFormProcédure

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SQLThreading
{
    
    public partial class FrmThreadDataBase : Form
    {
    
        public FrmThreadDataBase()
        {
    
            InitializeComponent();
        }

        private void btnExecute1_Click(object sender, EventArgs e)
        {
    
            Thread th1 = new Thread(() =>
            {
    
                Thread.Sleep(2000);
                string classCount = Helper.GetSingleResult("select count(*) from StudentClass").ToString();
                this.lblResult1.Invoke(new Action<string>(t => {
     this.lblResult1.Text = t; }),classCount);
            });
            th1.IsBackground = true;
            th1.Start();
        }

        private void btnExecute2_Click(object sender, EventArgs e)
        {
    
            Thread th2 = new Thread(() =>
            {
    
                Thread.Sleep(2000);
                string stuCount = Helper.GetSingleResult("select count(*) from Students").ToString();
                this.lblResult2.Invoke(new Action<string>(t => {
     this.lblResult2.Text = t; }), stuCount);
            });
            th2.IsBackground = true;
            th2.Start();
        }

        private void btnGetData_Click(object sender, EventArgs e)
        {
    
            Thread th3 = new Thread(() =>
            {
    
                Thread.Sleep(2000);
                //string stuCount = Helper.GetSingleResult("select count(*) from Students").ToString();
                //this.lblResult2.Invoke(new Action<string>(t => { this.lblResult2.Text = t; }), stuCount);

                //Accès à la base de données, Visites simultanées2Tableaux, Séparer par un point - virgule Select  Sélectionné plus tard ,  Est le nom de colonne à afficher 
                //Invoke  Peut être utilisé à travers les fils . Action  Délégué générique sans valeur de retour 
                //sleep, Retard,  Vous pouvez voir le processus 
                //dgvLier la source de données
                //Attention!DataSet, DataTable, DataRow, DataColoumnLa relation entre 
                DataSet ds = Helper.GetDataSet("Select * from StudentClass;select StudentName,Gender,PhoneNumber from Students") ;
                DataTable dt1 = ds.Tables[0];
                DataTable dt2 = ds.Tables[1];

                this.dgv1.Invoke(new Action<DataTable>(c =>
                {
    
                    this.dgv1.DataSource = c;
                }),dt1);
                Thread.Sleep(2000);
                this.dgv2.Invoke(new Action<DataTable>(s=>this.dgv2.DataSource=s),dt2);

            });
            th3.IsBackground = true;
            th3.Start();
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SQLThreading
{
    
    public partial class FrmThreadDataBase : Form
    {
    
        public FrmThreadDataBase()
        {
    
            InitializeComponent();
        }

        private CancellationTokenSource cts1 = new CancellationTokenSource();
        private CancellationTokenSource cts2 = new CancellationTokenSource();
        private CancellationTokenSource cts3 = new CancellationTokenSource();
        private void btnExecute1_Click(object sender, EventArgs e)
        {
    
            Task.Run(() =>
            {
    
                string classCount = Helper.GetSingleResult("select count(*) from StudentClass").ToString();
                this.lblResult1.Invoke(new Action<string>(t=> 
                {
    
                    this.lblResult1.Text = t;
                }),classCount);
            },cts1.Token);
            //Thread th1 = new Thread(() =>
            //{
    
            // Thread.Sleep(2000);
            // string classCount = Helper.GetSingleResult("select count(*) from StudentClass").ToString();
            // this.lblResult1.Invoke(new Action<string>(t => { this.lblResult1.Text = t; }),classCount);
            //});
            //th1.IsBackground = true;
            //th1.Start();
        }

        private void btnExecute2_Click(object sender, EventArgs e)
        {
    
            Task.Run(() =>
            {
    
                string stuCount = Helper.GetSingleResult("select count(*) from Students").ToString();
                this.lblResult2.Invoke(new Action<string>(t=>
                {
    
                    this.lblResult2.Text = t;
                }), stuCount);
            }, cts2.Token);
            //Thread th2 = new Thread(() =>
            //{
    
            // Thread.Sleep(2000);
            // string stuCount = Helper.GetSingleResult("select count(*) from Students").ToString();
            // this.lblResult2.Invoke(new Action<string>(t => { this.lblResult2.Text = t; }), stuCount);
            //});
            //th2.IsBackground = true;
            //th2.Start();
        }

        private void btnGetData_Click(object sender, EventArgs e)
        {
    
            Task.Run(() =>
            {
    
                DataSet ds1 = Helper.GetDataSet("select StudentName,Gender,PhoneNumber from Students");
                DataSet ds2 = Helper.GetDataSet("Select * from StudentClass");
                DataTable dt1 = ds1.Tables[0];
                DataTable dt2 = ds2.Tables[0];
                this.dgv1.Invoke(new Action<DataTable>(t=>
                {
    
                    this.dgv1.DataSource = t;
                }),dt1);
                this.dgv2.Invoke(new Action<DataTable>(k =>
                {
    
                    this.dgv2.DataSource = k;
                }), dt2);
                //this.dgv1.DataSource = dt1;
            },cts3.Token);
            //Thread th3 = new Thread(() =>
            //{
    
            // Thread.Sleep(2000);
            // //string stuCount = Helper.GetSingleResult("select count(*) from Students").ToString();
            // //this.lblResult2.Invoke(new Action<string>(t => { this.lblResult2.Text = t; }), stuCount);

            // //Accès à la base de données, Visites simultanées2Tableaux, Séparer par un point - virgule Select  Sélectionné plus tard ,  Est le nom de colonne à afficher 
            // //Invoke  Peut être utilisé à travers les fils . Action  Délégué générique sans valeur de retour 
            // //sleep, Retard,  Vous pouvez voir le processus 
            // //dgvLier la source de données
            // //Attention!DataSet, DataTable, DataRow, DataColoumnLa relation entre 
            // DataSet ds = Helper.GetDataSet("Select * from StudentClass;select StudentName,Gender,PhoneNumber from Students") ;
            // DataTable dt1 = ds.Tables[0];
            // DataTable dt2 = ds.Tables[1];

            // this.dgv1.Invoke(new Action<DataTable>(c =>
            // {
    
            // this.dgv1.DataSource = c;
            // }),dt1);
            // Thread.Sleep(2000);
            // this.dgv2.Invoke(new Action<DataTable>(s=>this.dgv2.DataSource=s),dt2);

            //});
            //th3.IsBackground = true;
            //th3.Start();
        }
    }
}

版权声明
本文为[La lave de Rodinia]所创,转载请带上原文链接,感谢
https://chowdera.com/2022/01/202201080558307400.html

随机推荐