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 = ;
- }
- 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 = ;
- }
- 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< || DateTime.Now.Subtract(userInfo.LastErrorDateTime).Minutes> )
- {
- 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(, "老马", );
- dt1.Rows.Add(, "赵黑", );
- dt1.Rows.Add(, "老王", );
- dt1.Rows.Add(, "老汪", );
- //-------
- //创建一张内存表
- 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(, "老马", );
- dt2.Rows.Add(, "赵黑", );
- dt2.Rows.Add(, "老王", );
- dt2.Rows.Add(, "老汪", );
- foreach(DataTable tb in ds.Tables)
- {
- foreach (DataRow dataRow in tb.Rows)
- {
- Console.WriteLine(dataRow[]+" " +dataRow[]+" "+dataRow[]);
- }
- }
- }
- }
- }
C# 连接数据库等的更多相关文章
- react+redux教程(八)连接数据库的redux程序
前面所有的教程都是解读官方的示例代码,是时候我们自己写个连接数据库的redux程序了! 例子 这个例子代码,是我自己写的程序,一个非常简单的todo,但是包含了redux插件的用法,中间件的用法,连接 ...
- 【基于WinForm+Access局域网共享数据库的项目总结】之篇三:Access远程连接数据库和窗体打包部署
篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...
- winForm连接数据库(sqlserver2005)
帮同学搞个课程设计winform连接sqlserver2005 具体方法: .添加App.config文件 2.在App.config文件中添加节点 <?xml version="1. ...
- c3p0连接数据库的3种方式
c3p0连接数据库的3种方式,这里以mysql为例 1. 直接用set方法设置参数, 基本方法 ComboPooledDataSource dataSource = new ComboPooledDa ...
- Java连接数据库的辣几句话
Java连接数据库的辣几句话 1.java连接Oracle数据库 使用以下代码三个步骤: 1.下载ojdbc.jar包并导入项目中.附下载地址:http://download.csdn.net/det ...
- 基础的jdbc连接数据库操作
首先我们知道在数据库中,我们可以直接写sql或者直接通过数据库工具操作数据,但是在java程序中我们是不能直接操作数据库数据的,所以这就引入了jdbc操作. 百度百科:JDBC(Java Data B ...
- Python 3.x 连接数据库(pymysql 方式)
==================pymysql=================== 由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 ...
- JDBC连接数据库
JDBC连接数据库 1.加载JDBC驱动程序. Class.forName("com.mysql.jdbc.Driver"); 建立连接,. Connection conn = D ...
- java开发中JDBC连接数据库代码和步骤
JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.l ...
- 解决 PLSQL Developer无法连接数据库
问题:PLSQL Developer无法连接数据库 原因:PLSQL Developer不支持x64的Oracle客户端 解决方案:1.下载instantclient-basic-nt-12.1.0. ...
随机推荐
- Atitit.软件button和仪表板(13)--全文索引操作--db数据库子系统mssql2008
Atitit.软件button和仪表板(13)--全文索引操作--db数据库子系统mssql2008 全文索引操作 4.全文索引和like语句比較 1 5.倒排索引 inverted index 1 ...
- linux下一个C语言要求CPU采用
部分 从灾难中 本来我想写一个小程序来测试CPU其他工具利用它可以检验类数据的性能.以后参考IPbench中间cpu_target_lukem插件实现我们的功能.原理非常简单:就是我们给程序设置了 ...
- 离散时间信号常见函数的实现(matlab)
1. 单位样本序列 δ(n−n0)={1,n=n00,n≠n0 function [x, n] = impseq(n0, n1, n2) n = n1:n2; x = [n == n0]; 2. 单位 ...
- WPF 图片灰度处理
原文:WPF 图片灰度处理 文章的内容是来自微软中文技术论坛的一个帖子,当时是想将一段将图片灰度处理的代码转换为XAML的一个样式,在这里要谢谢 Xiao Yan Qiang.Sheldon _Xia ...
- linq to entity DistinctBy && DefaultIfEmpty
根据某属性去重 使用第三方库: https://github.com/morelinq/MoreLINQ Install-Package morelinq -Version 3.0.0 data.Di ...
- 1-9 RHEL7-文件权限管理
本节所讲内容: 文件的基本权限:r w x (UGO+ACL) 文件的高级权限:suid sgid sticky 第1章 文件的基本权限 1.1 权限的作用 通过对文件设定权限可以达到以下三种访问限制 ...
- WPF DatePicker默认显示当前日期,格式化为年月日
原文:WPF DatePicker默认显示当前日期 WPF的日历选择控件默认为当前日期,共有两种方法,一种静态,一种动态. 静态的当然写在DatePicker控件的属性里了,动态的写在对应的cs文件里 ...
- WPF 数据模板DataType属性的使用,不用指定ItemTemplate
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- 图像滤镜艺术---Wave滤镜
原文:图像滤镜艺术---Wave滤镜 Wave Filter水波滤镜 水波滤镜是通过坐标变换来模拟水波效果,使图像呈现出水波的特效.这个滤镜有一个可调参数:水波的扭曲程度. 代码如下; // ...
- 小记Linux下对mac80211内核模块修改
mac80211内核模块实现了对802.11协议的处理过程.其中mlme.c文件中的内容实现了对Deauth管理帧的处理.考虑到Deauth攻击至今仍没有好的防御方法(据说有802.11w,可是我一直 ...