三层01

C#
本文总阅读量:
  1. 1. SqlHelper实现
  2. 2. md5
  3. 3. 使用NPOI操作Excel

SqlHelper实现

  1. 往app.config中添加connectionstrings
1
2
3
<connectionStrings>
<add name="constr" connectionString="data source=”LUOX78“的WIN;initial catalog=school;integrated security=true"/>
</connectionStrings>
  1. 创建SqlHelper类

    1
    2
    3
    4
    public class SqlHelper
    {
    private string constr;
    }
  2. 添加引用给constr赋值

    1
    2
    3
    using System.Configuration;

    private string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
  3. 编写无返回值,有一行返回值,返回多行,返回datatable的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public static int ExecuteNoQuery(string sql, CommandType type = CommandType.Text,params SqlParameter[] sqlParameters)
    {
    using (var con = new SqlConnection(constr))
    {
    using (var cmd = new SqlCommand(sql, con))
    {
    if (sqlParameters == null)
    return 0;
    cmd.Parameters.AddRange(sqlParameters);
    cmd.CommandType = type;
    con.Open();
    return cmd.ExecuteNonQuery();
    }
    }
    }

    public static SqlDataReader ExecuteReader(string sql, CommandType type = CommandType.Text,
    params SqlParameter[] sqlParameters)
    {
    using (var con = new SqlConnection(constr))
    {
    using (var cmd = new SqlCommand(sql, con))
    {
    if (sqlParameters == null)
    return null;
    cmd.CommandType = type;
    cmd.Parameters.AddRange(sqlParameters);
    try
    {
    con.Open();
    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch (Exception e)
    {
    con.Close();
    Console.WriteLine(e);
    throw;
    }

    }
    }
    }


    public static DataTable ExecuteDataTable(string sql, CommandType type = CommandType.Text,
    params SqlParameter[] sqlParameters)
    {
    var dt=new DataTable();
    using (var adapter = new SqlDataAdapter(sql, constr))
    {
    if (sqlParameters != null)
    {
    adapter.SelectCommand.Parameters.AddRange(sqlParameters);
    }
    adapter.SelectCommand.CommandType = type;
    adapter.Fill(dt);
    }
    return dt;
    }

md5

MD5算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错)。任何长度的任意内容都可以用MD5计算出散列值。介绍工具:CalcMD5.zip。主要作用就是【验明“真身”】,字符串与文件均可。

MD5长度一般是32位的16进制数字符串(比如71f396e4134a1160d90bb1439876df31),MD5值的个数是有限的,但是源数据是无限的,因此存在着不同的内容产生相同MD5值的概率。因此MD5算法不可逆,也就是只能得到内容对应的MD5值,无法由MD5值反推内容。但是对不同的内容产生相同MD5值的概率非常非常非常低!

同一个字符串或文件生成的MD5都是一样的

用处:登录密码存入数据库使用MD5,检验文件是否被修改过

.NET下MD5使用

string的MD5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//创建MD5对象
MD5 obj=MD5.Create();

//转换
//编码的不同会导致获取MD5值不一样
var md5Bytes = obj.ComputeHash(Encoding.UTF8.GetBytes(str));
var sb=new StringBuilder(32);
foreach (byte md5Byte in md5Bytes)
{
sb.Append(md5Byte.ToString("x2"));
}
//或者直接使用bitconvert
BitConverter.ToString(md5Bytes).Replace("-", "");

//释放资源
obj.Clear();

文件的MD5(向ComputeHash传入流即可)

1
2
3
4
5
byte[] md5Bytes;
using (var reader = File.OpenRead(path))
{
md5Bytes = obj.ComputeHash(reader);
}

其他的散列算法:SHA512或SHA256,用法与MD5一样

1
SHA512 obj = SHA512.Create();

使用NPOI操作Excel

Excel组成:workbook(工作簿),sheet [ʃit] (工作表),row行,cell单元格

先添加NOPI引用

1. 写入excel表单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//创建excel对象(workbook)
IWorkbook wk=new HSSFWorkbook();

//workbook中创建sheet
ISheet sheet = wk.CreateSheet("工作表1");

//创建10行
for (int i = 0; i < 10; i++)
{
IRow row = sheet.CreateRow(i);
var cell = row.CreateCell(0);
cell.SetCellValue("luox78");

var cell2 = row.CreateCell(1);
cell2.SetCellValue(i);
}

//保存
using (var writer=File.OpenWrite("wk1.xls"))
{
wk.Write(writer);
}
2. 读取excel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private static void ReadFromXls()
{
//创建excel对象(workbook)
using (var reader=File.OpenRead("ReadExcel.xls"))
{
IWorkbook wk = new HSSFWorkbook(reader);

for (int i = 0; i < wk.NumberOfSheets; i++)
{
//获取每个sheet
var sheet = wk.GetSheetAt(i);
Console.WriteLine($"sheet{i}:{sheet.SheetName}");

for (int j = 0; j <= sheet.LastRowNum; j++)
{
//获取每个row
var row = sheet.GetRow(j);
Console.WriteLine($"row{j}:");
for (int k = 0; k < row.LastCellNum; k++)
{
//输出每个cell的内容
Console.WriteLine(row.GetCell(k).ToString());
}
}
}
}
  1. 从数据库中导出excel

    两步和之前一样

    从数据库中读取数据

    调用WriteToExcel(IWorkbook wk,Dictionary<ISheet,List<IRow>> sheets )

    对于空处理:从数据库读取为unknown,模型的值类型修改成可空值类型

    1
    reader.IsDBNull(column)?null:(int?)reader.GetInt32(column);

    写入到excel时

    1
    2
    3
    4
    5
    ICell cell = row.CreateCell(colomn);
    if(read == null)
    cell.SetCellType(CellType.BLANK);//设置创建的单元格为空单元格
    else
    cell.SetCellValue((Type)read);//将Type类型的数据放入cell