当前位置:网站首页>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
边栏推荐
- Jimureport building block report v1 Version 4.2 release, free visual low code report
- JVM - automatic memory management - 2 - garbage collector and memory allocation strategy
- Spotmax update: scalable statistics, instance preheating, intelligent storage, providing multiple cost reduction guarantees
- 黑五 圣诞节
- 【TiChoo资讯站】
- 行业分享 | TiChoo数据CEO 陆诗冬展望全球视频电商未来蓝图
- TiChoo数据分析选品 { 资讯站 }
- 【TiChoo资讯站】TikTok及跨境电商周报
- 行业分享 | TiChoo数据即将出席2022年海外短视频行业峰会
- tiktok 数据分析平台
猜你喜欢
随机推荐
- nuget的几个地址
- 使用Text.json解析Json文件
- 常用的SQL语句
- 使用多线程写winform程序
- Modbus协议编写与测试
- 使用多线程,Invoke和Action 访问SQL数据库
- Access数据库练习
- 泛型类, 泛型接口的继承, 委托
- 泛型类,泛型接口
- is 和 as的用法
- 多线程的深入理解
- 异步调用,多线程
- 跨域请求无法携带Cookie的问题
- Jenkins 入门
- Jenkins 分布式架构
- Jenkins 配置中文显示(汉化)
- Jenkins 通过API 执行 grovvy 脚本
- Jenkins API接入指南
- Jenkins 通过API获取从节点的secret
- 浅析npm run serve命令
- I think code is a work of art. She's beautiful
- Push failed Dst refspec V1.0.0 matches more than one.
- 微服务系列--深入理解RPC底层原理与设计实践
- Try the map and slice of the model version in go 1.18
- [highcharts] 04_ wrap
- (highly recommended) mobile audio and video from zero to start
- 微服務系列--深入理解RPC底層原理與設計實踐
- Push failed Dst refspec V1.0.0 matches more than one.
- Série de microservices - compréhension approfondie des principes sous - jacents et des pratiques de conception du CPR
- Push failed DST refspec v1. 0,0 matches more than one.
- Analyse de la commande NPM Run Service
- Jenkins obtient le secret du noeud via l'API
- Jenkins API Access Guide
- Quickly write a vs code plug-in
- Yyds dry goods inventory trunk (I)
- Modify a value to make Scrollview and listview elastic and APK volume optimized
- Jenkins exécute le script grovvy via l'API
- Jenkins configure l'affichage chinois (chinois)
- Jenkins Distributed Architecture
- Introduction à Jenkins