C# 连接数据库等
SqlConnection
连接池:可以通过连接字符串配置连接池。
对象池技术:HttpApplication :Asp.Net
生产者 消费者。 线程。
应用程序跟数据连接非常耗时,而且连接使用非常频繁,使用连接池可以提高连接对象重用效率
SqlCommand
ExcuteNonQuery() 执行非查询类的sql脚本,返回影响的行数
ExcuteScalar() 执行sql,返回第一行第一列的值
ExcuteReader() 返回SqlDataReader
Reader默认指向 数据行
Read()方法执行一次,指针向下走一次。
省市选择。
导出数据
using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _02ProvinceCitySelect { public partial class MainFrm : Form { public MainFrm() { InitializeComponent(); } private void MainFrm_Load(object sender, EventArgs e) { //加载数据库中的所有的省的数据 string connStr = ConfigurationManager.ConnectionStrings["sqlConn"].ConnectionString; //创建链接对象 using (SqlConnection conn =new SqlConnection(connStr)) { using (SqlCommand cmd =conn.CreateCommand()) { conn.Open();//***********8 cmd.CommandText =@"select AreaId, AreaName, AreaPid from [dbo].[AreaFull] where AreaPId=0"; using (SqlDataReader reader = cmd.ExecuteReader()) { while ( reader.Read()) { //int AreadId = int.Parse(reader["AreaId"].ToString()); //把表格的数据转换成 对象数据 AreaInfo areaInfo = new AreaInfo(); areaInfo.AreaId = int.Parse(reader["AreaId"].ToString()); areaInfo.AreaName = reader["AreaName"].ToString(); areaInfo.AreaPId = int.Parse(reader["AreaPId"].ToString()); //把省的信息放到 ComboBox中。ComboBox显示信息是 Item对象的ToString() this.cbxProvince.Items.Add(areaInfo); } }//end useing reader }//end useing cmd }//end using conn this.cbxProvince.SelectedIndex = 0; } private void cbxProvince_SelectedIndexChanged(object sender, EventArgs e) { AreaInfo provinceAreaInfo= this.cbxProvince.SelectedItem as AreaInfo; //判断是否 拿到的城市为空 if (provinceAreaInfo == null) { return; } //根据省的Id获取所有的城市信息 //加载数据库中的所有的省的数据 string connStr = ConfigurationManager.ConnectionStrings["sqlConn"].ConnectionString; //创建链接对象 using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = conn.CreateCommand()) { conn.Open();//***********8 cmd.CommandText = @"select AreaId, AreaName, AreaPid from [dbo].[AreaFull] where AreaPId="+provinceAreaInfo.AreaId; using (SqlDataReader reader = cmd.ExecuteReader()) { this.cbxCity.Items.Clear(); while (reader.Read()) { //int AreadId = int.Parse(reader["AreaId"].ToString()); //把表格的数据转换成 对象数据 AreaInfo areaInfo = new AreaInfo(); areaInfo.AreaId = int.Parse(reader["AreaId"].ToString()); areaInfo.AreaName = reader["AreaName"].ToString(); areaInfo.AreaPId = int.Parse(reader["AreaPId"].ToString()); //把省的信息放到 ComboBox中。ComboBox显示信息是 Item对象的ToString() this.cbxCity.Items.Add(areaInfo); } }//end useing reader }//end useing cmd }//en this.cbxCity.SelectedIndex = 0; } private void btbExport_Click(object sender, EventArgs e) { #region 选择保存文件 string fileName = string.Empty;// 保存的文件名 //让用户选择 要保存的文件路径 using (SaveFileDialog sfd = new SaveFileDialog()) { if (sfd.ShowDialog() != DialogResult.OK) { return; } fileName = sfd.FileName; } #endregion // 查询数据数据,写入数据 string connStr = ConfigurationManager.ConnectionStrings["sqlConn"].ConnectionString; using (SqlConnection conn =new SqlConnection(connStr)) { using (SqlCommand cmd =conn.CreateCommand()) { conn.Open(); cmd.CommandText = "select AreaId, AreaName, AreaPid from [dbo].[AreaFull]"; using (SqlDataReader reader =cmd.ExecuteReader()) { string tempLine = string.Empty; using (StreamWriter writer =new StreamWriter(fileName)) { while (reader.Read()) { tempLine = reader["AreaId"] + "," + reader["AreaName"] + "," + reader["AreaPId"]; writer.WriteLine(tempLine);//写入文本文件 } } } } } } } }
2、案例:
输错三次禁止登陆,15分钟后才能继续。
->用数据库记录ErrorTimes,最后出错时间lastErrorDateTime
->思路:
->什么情况允许登陆?
-> 输入错误次数<3 || 最后错误时间>15分钟
->第一步:先用户的Id,用户名,用户密码,用户错误次数,用户最后的错误时间 where UserName=txtUserName.Text and UserPwd=txtUserPwd.Text
->第二步:判断是否查询出数据
->如果没有数据:如果没有数据,用户名和密码不正确。
增加一次错误次数,修改一下错误时间。
->如果有数据,说明用户名密码正确。那么进行后续判断,
->校验时间是否符合规范,登陆次数是否满足。
->满足
->不满足:提示。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _03LoginLockDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnLogin_Click(object sender, EventArgs e) { //第一步:先用户的Id,用户名,用户密码,用户错误次数,用户最后的错误时间 where UserName=txtUserName.Text and UserPwd=txtUserPwd.Text string connStr = ConfigurationManager.ConnectionStrings["sqlConn"].ConnectionString; using (SqlConnection conn=new SqlConnection(connStr)) { using (SqlCommand cmd =conn.CreateCommand()) { conn.Open(); cmd.CommandText = @"SELECT [UserId] ,[UserName] ,[UserPwd] ,[LastErrorDateTime] ,[ErrorTimes] FROM [UserInfo] WHERE UserName='"+txtName.Text +"' and UserPwd='"+txtPwd.Text+"' "; UserInfo userInfo = null;//查询来的数据封装的对象。 using (SqlDataReader reader = cmd.ExecuteReader()) { //把查询出来的数据赋值到userInfo if (reader.Read()) { userInfo =new UserInfo(); userInfo.UserId = int.Parse(reader["UserId"].ToString()); userInfo.UserPwd = reader["UserPwd"].ToString(); userInfo.LastErrorDateTime = DateTime.Parse(reader["LastErrorDateTime"].ToString()); userInfo.ErrorTimes = int.Parse(reader["ErrorTimes"].ToString()); } }//花括号执行结束之前,链接一直没有关闭,这时候Reader一直占用Connection对象。 //如果查询结果为空,说明用户名密码错误,修改错误次数和 错误时间。 if (userInfo==null) { //修改 错误时间,错误次数 where UserName=txtUserName.Text cmd.CommandText = "update UserInfo set LastErrorDateTime=getdate(), ErrorTimes=ErrorTimes+1 where UserName='" + txtName.Text.Trim() + "'"; cmd.ExecuteNonQuery(); MessageBox.Show("用户名密码Error"); return; } //如果有数据。后面校验时间 错误次数。 if (userInfo.ErrorTimes<3 || DateTime.Now.Subtract(userInfo.LastErrorDateTime).Minutes>15 ) { MessageBox.Show("登陆成功!"); // cmd.CommandText = "update UserInfo set LastErrorDateTime=getdate(), ErrorTimes=0 where UserId=" +userInfo.UserId; cmd.ExecuteNonQuery(); } else { MessageBox.Show("登陆失败!账号被锁定!"); } } } } } }
3、查询语句参数化
->Sql注入问题演示。
->参数化解决Sql注入的难题
4、DataSet和DataTable
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _04DataSetDemos { public partial class MainFrm : Form { public MainFrm() { InitializeComponent(); } private void MainFrm_Load(object sender, EventArgs e) { //创建一个内存的数据集 DataSet ds =new DataSet("DS5"); //创建一张内存表 DataTable dt1 =new DataTable("dt1"); //把表放到数据集里面去。 ds.Tables.Add(dt1); //给表定义列 DataColumn dcName = new DataColumn("Name",typeof(string)); DataColumn dcAge = new DataColumn("Age",typeof(int)); DataColumn dcId=new DataColumn("Id",typeof(int)); //把列放到表里面去。 dt1.Columns.AddRange(new DataColumn[]{dcId,dcName,dcAge}); //给表添加数据 dt1.Rows.Add(1, "老马", 18); dt1.Rows.Add(1, "赵黑", 29); dt1.Rows.Add(1, "老王", 18); dt1.Rows.Add(1, "老汪", 19); //------- //创建一张内存表 DataTable dt2 = new DataTable("dt2"); //把表放到数据集里面去。 ds.Tables.Add(dt2); //给表定义列 DataColumn dcName2 = new DataColumn("Name", typeof(string)); DataColumn dcAge2 = new DataColumn("Age", typeof(int)); DataColumn dcId2 = new DataColumn("Id", typeof(int)); //把列放到表里面去。 dt2.Columns.AddRange(new DataColumn[] { dcId2, dcName2, dcAge2 }); //给表添加数据 dt2.Rows.Add(1, "老马", 18); dt2.Rows.Add(1, "赵黑", 29); dt2.Rows.Add(1, "老王", 18); dt2.Rows.Add(1, "老汪", 19); foreach(DataTable tb in ds.Tables) { foreach (DataRow dataRow in tb.Rows) { Console.WriteLine(dataRow[0]+" " +dataRow[1]+" "+dataRow[2]); } } } } }
有志者、事竟成,破釜沉舟,百二秦关终属楚;
苦心人、天不负,卧薪尝胆,三千越甲可吞吴.
加油吧,致每个正在奋斗路上的你!!!