萌新一枚,后期会定期持续更新,大家有什么好的项目技巧可以一起分享,一起进步,欢迎一切有建设性的建议!!
项目场景1:
背景:
在日常项目中,很多时候某些参数可能会时常需要改变,一般情况下,在没有用数据库或者设计出可修改的显示界面,一般推荐使用配置文档供给现场人员修改的方式:
代码演示:构建ini配置文件的方式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
namespace FileConfig
{
public class ConfigHelp
{
//设置配置文件路径
public string Path { get ; set; }
/// <summary>
/// 修改INI文件中内容
/// </summary>
/// <param name="section">在其中写入的节点(文件名)名称</param>
/// <param name="key">设置的项名</param>
/// <param name="val">要写入的新字符串</param>
/// <param name="filePath">INI文件完整路径</param>
/// <returns>非零表示成功,零表示失败</returns>
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
/// <summary>
/// 为INI文件中指定的节点取得字符串
/// </summary>
/// <param name="section">在其中查找关键字的节点名称</param>
/// <param name="key">获取的项名</param>
/// <param name="def">指定的项没有找到时返回的默认值</param>
/// <param name="retVal">指定一个字串缓冲区,长度至少为nSize</param>
/// <param name="size">指定装载到lpReturnedString缓冲区的最大字符数量</param>
/// <param name="filePath">INI文件完整路径</param>
/// <returns>复制到lpReturnedString缓冲区的字节数量,其中不包括那些NULL中止字符</returns>
/// <returns></returns>
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
/// <summary>
/// 导入文件路径
/// </summary>
/// <param name="path"></param>
public ConfigHelp(string path)
{
Path = path;
}
public ConfigHelp() { }
/// <summary>
/// 在指定的路径设置INI配置文件
/// </summary>保存格式:键=值 : A=20
/// <param name="Section">文件名</param>
/// <param name="key">键,如A</param>
/// <param name="Value">值,如20</param>
public void ISetValue(string Section, string key, string Value)
{
WritePrivateProfileString(Section, key, Value, this.Path);
}
/// <summary>
/// 在指定路径上的INI读取内容
/// </summary>
/// <param name="Section">文件名</param>
/// <param name="key">键名</param>
/// <returns></returns>
public string IGetValue(string Section,string key)
{
//预存值开辟的字符串空间大小
StringBuilder temp = new StringBuilder(1024);
int i = GetPrivateProfileString(Section, key, "", temp, 1024, this.Path);
return temp.ToString();
}
/// <summary>
/// 验证文件是否存在
/// </summary>
/// <returns></returns>
public bool ExistINIFile()
{
return File.Exists(Path);
}
}
}
代码演示:构建json配置文件的方式
PS:需要引用这两个命名空间
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
//构建存储Json配置文件的路径
string path
//构建存储
private List<JsonOne> record = new List<Json>();
//写入操作
public void Write(string Name,string Port) {
//添加对象数据进入对象数组
record.add(new JsonOne(Name,Port));
JsonOne[] j = record.ToArray();
File.WriteAllText(path, JsonConvert.SerializeObject(j));
}
//读取操作
public void Read() {
string json = File.ReadAllText(path);
JArray ja = JArray.Parse(json);
foreach(JObject jo in ja)
{
//返回存储的对象信息
JsonOne js = new JsonOne(jo["Address"].ToString(), jo["Port"].ToString());
//record.Add(js);
}
}
class JsonOne
{
private string address;
private string port;
public string Address { get => address; set => address = value; }
public string Port { get => port; set => port = value; }
public JsonOne(){}
public JsonOne(string address, string port)
{
this.Address = address;
this.port = port;
}
}
缺点分析:
以上ini配置文件方式可以能满足日常项目使用,但该方法只能用于短字符串的存储,对于很长的字符串存储就会报错,并且该方法不支持Linux平台
根据自己的选择也用使用Json文件的存储形式
解决方案:
后期有好的方法配置方法会更新,欢迎各位提供建议。
项目场景2:
有时候,当我们使用Winform中的DataTable组件时,会把数据表或者列表的内容显示在界面上,但获取的数据是动态的,有时候要将显示的数据保存到本地文件中,以报表的形式(Excel)存储起来
代码演示:
using Microsoft.Office.Interop.Excel;
public string check;
public DataBaseManager database
//导出方法
private void Export()
{
//保存文件对话框
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Excel文件|*.xlsx|Word文件|*.docx";
sfd.FilterIndex = 0;
if (sfd.ShowDialog() == DialogResult.OK)
{
//将数据库中的数据导入到DataTable中
System.Data.DataTable dt = database.datatableReader(check);
//调用导出的方法
ExportExcel(dt, sfd.FileName);
}
}
//导出为Excel表格模式
private void ExportExcel(System.Data.DataTable dt, string filepath)
{
//创建Excel应用程序类的一个实例,相当于从电脑开始菜单打开Excel
ApplicationClass xlsxapp = new ApplicationClass();
//新建一张Excel工作簿
Workbook wbook = xlsxapp.Workbooks.Add(true);
//第一个sheet页
Worksheet wsheet = (Worksheet)wbook.Worksheets.get_Item(1);
//将DataTable的列名显示在Excel表第一行
for (int i = 0; i < dt.Columns.Count; i++)
{
//注意Excel表的行和列的索引都是从1开始的
wsheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
}
//遍历DataTable,给Excel赋值
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
//从第二行第一列开始写入数据
wsheet.Cells[i + 2, j + 1] = dt.Rows[i][j];
}
}
//保存文件
wbook.SaveAs(filepath);
MessageBox.Show("导出成功");
//释放资源
xlsxapp.Quit();
}
}
public class DataBaseManager{
//数据库读取数据转数据表
public DataTable datatableReader(string sql)
{
SqlDataReader Reader;
DataTable list = new DataTable();
if (Connected)
{
using (SqlConnection objConnection = new SqlConnection(Connection))
{
using (SqlCommand sqlcmd = new SqlCommand(sql, objConnection))
{
try
{
objConnection.Open();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + " @" + this.GetType().FullName + "- SqlServerReader");
}
try
{
Reader = sqlcmd.ExecuteReader();
list.Load(Reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + " @" + this.GetType().FullName + "- SqlServerReader");
}
}
}
}
return list;
}
}
缺点分析:
暂且未知
解决方案:
后期有好的导出方法会更新,欢迎各位提供建议。