您的位置:首页 > 职场人生

黑马程序员_学习日记52_622三层项目(MD5、NPOI)

2012-06-23 18:40 471 查看
1.知识点:
1.1用md5处理密码
2.术语
Call Center
计算机与电信集成技术(CTI)(来电显示)
CRM(客户关系管理,Custom Relationship Management)
OA(Office Automation)办公自动化
MIS(Management Information System)信息管理系统
ERP(Enterprise Resources Planning)企业资源计划

Seat(座席)电话后面坐着的客服
(*)交换机(应用于具有成百上千的座席的大型的呼叫中心)
PK语音卡(200人以下,相当于共享上网,无需申请业务)

3.MD5算法
3.1不可逆
3.2同一个值的MD5值相同
3.3不同的值计算出来的md5值是不同的。(理论上可能重复)
3.4用vs对字符串做md5处理
3.4.1计算字符串的MD5
导入System.Security.Cryptography命名空间
//1.创建MD5对象
MD5 md5 = MD5.Create();
//2.把字符串变成byte[]
//对于中文或某些字符,采用不同编码的byte[]值是不同的,所以采用不同编码其MD5值不同
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg);
//将byte[]通过MD5计算得到新的byte[]
byte[] md5Buffer = md5.ComputeHash(buffer);
//用完后记得clear
md5.Clear();
//3.将计算后的结果直接显示为字符串
StringBuilder sb = new StringBuilder();
for(int i = 0;i < md5Buffer.Length;i++)
{
//x2:把每个数字转换为16进制,并保留两位数字
sb.Append(md5Buffer[i].ToString("x2"));
}
return sb.ToString();

3.4.2计算文件的MD5
MD5 md5 = MD5.Create();
using(FileStream fs = File.OpenRead(path))
{
byte[] md5Buffer = md5.ComputeHash(fs);
md5.Clear();
StringBuilder sb = new StringBuilder();
for(int i=0;i<md5Buffer.Length;i++)
{
sb.Append(md5Buffer[i].ToString("x2"));
}
return sb.ToString();
}

4.通过MD5实现登录
4.1设计座席表
create database [CallCenter];
use CallCenter

--座席表的设计:主键、用户名、姓名、密码。错三次锁定
...
4.2做WinForm注册界面
用户名、真实姓名、密码
4.3连数据库
添加连接字符串的配置文件
4.4写SqlHelper
4.5写注册button_Click()
...
string upwd = CommonHelper.Md5Encrypt(txtPwd.Text);
string sql =
"insert into T_Seats values(@...)"
SqlParameter[]
...

4.6写CommonHelper类,封装字符串的MD5计算方法Md5Encrypt()
4.7做WinForm登录界面
4.7.1用户名、密码
4.7.2登录的button_Click()
写法一:
string pwd = CommonHelper.Md5Encrypt(txtPwd.Text);
string sql =
"select count(*) from T_Seats where ...";
SqlParameter[]...
int i = SqlHelper.ExecuteScalar(...);
if(i>0){登录成功;}
else{失败;}

写法二:(记录Id和姓名供修改使用)
sql = "select * from T_Seats where loginId=@uid";
if(upwd == pwd)
{
//登陆成功,记录当前用户主键Id与真实姓名
GlobalHelper.currentId = reader.GetInt32(0);
GlobalHelper.realname = reader.Getstring(1);
}

4.8修改密码
登录窗体有一个修改密码的按钮,登陆成功(将主键Id记录在静态变量中)则显示该按钮,进入修改窗体
ChangePwdForm_Load()
{

}
button_Click()
{
//1、验证两次密码是否一致
if(一致)
{
//2、验证旧密码是否正确
string sql =
"select count(*) from T_Seats where autoid=@autoid and loginId=@pwd";
...
SqlParameter("autoId",GlobalHelper.currentId)
...
if(旧密码正确)
{
//3、改密码
int r_update ChangePwd()
if(r_update>0)
{
修改成功!
}
}
}
}
ChangePwd(int autoId,string pwd)
{

}

4.9建静态类GlobalHelper,记录登录用户主键

5.Excel
5.1程序处理Excel的技术
OLE Automation
把Excel当成数据库
OpenXML
NPOI
5.2NPOI组件的引入
5.3通过NPOI操作Excel
5.3.1建WinForm 读取 写入
5.3.2添加NPOI引用
5.3.3把Excel考进debug
5.3.4读取Excel
button_Click()
{
//1、读取Excel到FileStream
using(FileStream fs = File.OpenRead("ReadExcel.xls"))
{
//2、根据fs创建Workbook
using(Workbook wk =
new HSSFWorkbook(fs))
{
//循环获取工作表
//wk.NumberOfSheets获取当前工作薄中工作表个数
for(i<wk.NumberOfSheets)
{
using(Sheet sheet = wk.GetSheetAt(i))
{

//循环获取每一行

//sheet.LastRowNum获取最后一行的索引

for(r <= sheet.LastRowNum)
{
Row row = sheet.GetRow(r);

//获取行中单元格

//row.LastCellNum获取最后一个单元格索引

for(c < row.LastCellNum)
{
Cell cell = ...
cw(cell.ToString());
}
cwL();
}
}
}

}
}

}
5.3.5写入Excel
button_Click()
{
//1、创建一个新的Workbook
using(Workbook wk =
new HSSFWorkbook())
{
//2、创建一个工作表Sheet
using(Sheet sheet = wk.CreateSheet("工作表1"))
{
//3、创建行
Row row1 = sheet.CreateRow(0);
//创建cell
for(i<10)
{
row1.CreateCell(i).SetCellValue("单元格"+i);
}
//再创建一行,如果这里索引还是0,会把上一行覆盖掉
Row row2 = sheet.CreateRow(1);
row2.CreateCell(0).SetCellValue("单元格一中的值");
row2.CreateCell(1).SetCellValue("单元格二中的值");
}

//创建一个文件流
using(FileStream fs = File.Write("C:\a.xls"))
{
wk.Write(fs);
MessageBox.Show("写入成功");
}
}
}
5.4数据库与Excel的导入导出
5.4.1数据库导出到Excel
string sql =
"select * from MyStudent";
using(SqlDataReader reader = SqlHelper.ExecuteReader(...))
{
if(reader.HasRow)
{
//在这里创建一个Workbook
using(Workbook wk =
new HSSFWorkbook())
{
using(Sheet sheet = wk.CreateSheet("MyStudent"))
{
int rowIndex = 0;
while(reader.Read())
{

//Fid,FName,...

int fid = reader.GetInt32(0);

string fname = reader.IsDbNull(1)? "NULL":reader.GetString(1);

//int? 可空值类型

int? fage = reader.IsDbNull(2)? null:(int?)reader.GetInt32(2);
...

//创建Excel行
Row row = sheet.CreateRow(rowIndex);

//创建单元格
row.CreateCell(0).setCellValue(fid);
row.CreateCell(1).SetCellValue(fname);

//如果fage为一个null值,则当前创建的单元格为空单元格

if(fage == null)
{
row.CreateCell(2,CellType.BLANK);
}

else
{
row.CreateCell(2).SetCellValue((int)fage);
}
...
rowIndex++;

}
using(FileStream fs = File.OpenWrite("MyStudent.xls"))
{
wk.Write(fs);
MB.Show("数据导出成功");
}
}
}
}
else
{
MS.Show("表中没有数据")
}
}
5.4.2Excel导入到数据库
//1、读取Excel中的数据
using(FileStream fs = File.OpenRead("myStudent.xls"))
{
//根据文件流创建Workbook
using(Workbook wk =
new HSSFWorkbook(fs))
{
if(wk.NumberOfSheets > 0)
{
using(Sheet sheet = wk.GetSheetAt(0))
{
//方法二:在循环外创建sqlParameter对象
//注意:同一个参数不能让多个command对象来使用。在SqlHelper中应该有cmd.Clear();
string sql =
"insert into MyStudent values(@name,@age,@gender...)";
SqlParameter[] pms =
new SqlParameter[];

//循环读取每一行
for(int r = 0;r <= sheet.LastRowNum;r++)
{
Row row = sheet.GetRow(r);

//读取除了第0列外的每一列,第0例是自动Id

string name = row.GetCell(1).StringCellValue=="NULL"?null:row.GetCell(1).StringCellValue;

//年龄为null导出的是Blank空单元格

int? age = row.GetCell(2)==null?null:(int?)row.GetCell(2).NumericCellValue;
...

//方法一:每一行都创建SqlParameter对象

//string sql = "insert into MyStudent values(@name,@age,@gender...)";

////对于空值,在C#中是null,但通过带参的Sql向数据库中插入null,需要使用DBNULL.value

//SqlParameter[] pms = new SqlParameter[]{

// ...

// new sqlParameter("@name",name==null?DBNull.Value:(object)name),

// ...

//}
SqlHelper.ExecuteNonQuery(sql,CommandType.Text,pms);
}
MB.Show("导入成功");
}
}
}
}
//2、将数据插入数据库

问题:
1、MD5的父类可以dispose,MD5为何不行?

作业:
P23 客户资料管理。(数据库与Excel导入导出)车牌或车架号有一个重复就不导入了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: