起初是因为一个非IT行业的朋友想要一个快捷的查询软件,由于自己不是很懂开发,又觉得Excel的查询使用太麻烦,所以想拜托我来做一个有查询功能的小程序。
由于我个人技术也是十分有限,也是第一次尝试部署Winform项目,所以花了不少时间才解决。
那么一个可以在公司使用的离线小程序,由于他公司设备限制,没有数据库软件,没有IDE,而直接查Excel表格的数据又需要一些列的东西更麻烦(Microsoft.ACE之类的)
所以我这边通过将excel表格通过SQL server转换成sql数据表,再通过序列化转换为json格式的数据。手动保存在了txt文档当中,这样就实现了不需要安装数据库即可查询。
使程序脱离了数据可也能完成查询。
序列化:
public static string Dtb2Json(DataTable dtb)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
System.Collections.ArrayList dic = new System.Collections.ArrayList();
foreach (DataRow dr in dtb.Rows)
{
System.Collections.Generic.Dictionary<string, object> drow = new System.Collections.Generic.Dictionary<string, object>();
foreach (DataColumn dc in dtb.Columns)
{
drow.Add(dc.ColumnName, dr[dc.ColumnName]);
}
dic.Add(drow);}
//序列化
return jss.Serialize(dic);
}
查询按钮点击事件:
private void btn_Search_Click(object sender, EventArgs e)
{
StreamReader sr = new StreamReader(@"C:\\Users\\info.txt");
string str = sr.ReadToEnd();
DataTable dt = JsonToDataTable(str);
DataTable source = dt.Select($"[服务网点名称] like '%{txt_Area.Text}%'").CopyToDataTable();
dataGridView1.DataSource = source;
}
唯一需要注意的是 StreamReader的路径是固定的。所以需要提前把txt文件放到指定的路径,就算是这样,使用的繁琐程度也大大降低了。
最后通过JsonToDataTable这个方法对StreamReader提取到的数据进行反序列化转换成datatable。
public static DataTable JsonToDataTable(string json)
{
DataTable table = new DataTable();
//JsonStr为Json字符串
JArray array = JsonConvert.DeserializeObject(json) as JArray;//反序列化为数组
if (array.Count > 0)
{
StringBuilder columns = new StringBuilder();JObject objColumns = array[0] as JObject;
//构造表头
foreach (JToken jkon in objColumns.AsEnumerable<JToken>())
{
string name = ((JProperty)(jkon)).Name;
columns.Append(name + ",");
table.Columns.Add(name);
}
//向表中添加数据
for (int i = 0; i < array.Count; i++)
{
DataRow row = table.NewRow();
JObject obj = array[i] as JObject;
foreach (JToken jkon in obj.AsEnumerable<JToken>())
{string name = ((JProperty)(jkon)).Name;
string value = ((JProperty)(jkon)).Value.ToString();
row[name] = value;
}
table.Rows.Add(row);
}
}
return table;
}
方法很粗糙,查询的东西很少,应该有更好的方法去优化和补充这个小程序。
但是通过这次测试我接触到了项目的打包(Setup Project)等新鲜的知识也是一笔不错的收获