• 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);//写入文本文件
                                }
                            }
                          
                        }
                    }
                }
            }
        }
    }
    View Code


    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("登陆失败!账号被锁定!");
                        }
                    }
                }
            }
        }
    }
    View Code

    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]);
                    }
                }
    
    
    
            }
        }
    }
    View Code
  • 相关阅读:
    [NOI Online 2021 提高组] 愤怒的小N
    [NOI Online 2021 提高组] 积木小赛
    「2020-2021 集训队作业」Yet Another Permutation Problem
    无标号有根树/无根树 计数
    无向图的 三元环
    有标号二分图计数
    有标号荒漠计数
    「雅礼集训 2018 Day8」B
    CF708E Student's Camp
    清华集训 2016 选做
  • 原文地址:https://www.cnblogs.com/cb1186512739/p/9482032.html
Copyright © 2020-2023  润新知