由于在介绍通用数据管理模块功能的时候用到了许多通用的功能,例如word和excel与DataGridView控件的相互导入导出、写日志到数据库中等等。为了后面每一篇文章都能清楚的知道每一个功能具体是怎么实现的,现在先统一把用到的所有公用功能统一介绍和实现。由于SqlHelper类,也就是数据库的一些通用操作已经在登录模块中介绍,就不在重复介绍了。本篇将相介绍通用工具类CommonTools,由于代码中有比较详细的注释了,就不详细解析具体代码的功能了。这个类实现的功能如下。
1.从DataGridView控件导出数据到Word文档
2.导出DataGridView中的数据到excel,实现代码如下:
saveFileDialog.ShowDialog();
Stream myStream;
myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312"));
string str = "";
try
{
//写标题
for (int i = 0; i < dataGridview1.ColumnCount; i++)
{
if (i > 0)
{
str += "\t";
}
str += dataGridview1.Columns[i].HeaderText;
}
sw.WriteLine(str);
//写内容
for (int j = 0; j < dataGridview1.Rows.Count; j++)
{
string tempStr = "";
for (int k = 0; k < dataGridview1.Columns.Count; k++)
{
if (k > 0)
{
tempStr += "\t";
}
tempStr += dataGridview1.Rows[j].Cells[k].Value.ToString();
}
sw.WriteLine(tempStr);
}
sw.Close();
myStream.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
sw.Close();
myStream.Close();
}
}
3.导入XML文件的数据到Oracle数据库
foreach (System.Data.DataTable dt in nds.Tables)
{
sql = "select * from ";
sql += strDatabaseName + "_" + dt.TableName;
OracleDataAdapter oda = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
OracleCommandBuilder builder = new OracleCommandBuilder(oda);
oda.Fill(nds.Tables[dt.TableName]);
}
try
{
XmlDocument doc = new XmlDocument();
doc.Load(strXmlFileName);
XmlNodeList nodeList = doc.GetElementsByTagName("tableType");
string strTableType = string.Empty;
foreach (XmlNode node in nodeList)
{
if (node.Name == "tableType")
{
strTableType += node.InnerText + ";";
}
}
strTableType = strTableType.Substring(0, strTableType.Length - 1);
foreach (XmlNode node in nodeList)
{
if (node.Name == "tableType")
{
node.InnerText = strTableType;
break;
}
}
nodeList = doc.GetElementsByTagName("graphOverview");
foreach (XmlNode node in nodeList)
{
if (node.Name == "graphOverview")
{
string str = string.Empty;
if (node.InnerText.IndexOf(".jpg".ToUpper()) != -1)
{
str = node.InnerText.Substring(node.InnerText.IndexOf(".jpg".ToUpper()) + 4);
}
else if (node.InnerText.IndexOf(".jpg") != -1)
{
str = node.InnerText.Substring(node.InnerText.IndexOf(".jpg") + 4);
}
node.InnerText = str;
break;
}
}
doc.Save("temp.xml");
nds.ReadXml("temp.xml");
System.IO.File.Delete("temp.xml");
foreach (System.Data.DataTable dt in nds.Tables)
{
if (dt.Rows.Count > 0)
{
string strTableName = strDatabaseName + "_" + dt.TableName;
sql = "select * from " + strTableName;
DataSet ds = new DataSet();
OracleDataAdapter oda = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
OracleCommandBuilder builder = new OracleCommandBuilder(oda);
oda.Fill(ds);
oda.Update(dt);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
LogHelp.writeLog(FrmMain.metaUsername, "元数据目录管理",
"导入元数据文件<" + strXmlFileName + ">失败!");
}
}
这个函数主要用在元数据管理子系统,把XML格式的数据导入Oracle数据库,这里XML格式的文件是通过一个XSD文件定义格式得到的,XSD文件就是Xml数据格式的约束文件,就是通过它定义XML具体的格式。然而微软有一个工具可以根据这个XSD文件生成对应的数据集类,在我的代码里就是NewDataSet类。这个数据集类就可以管理对应的格式的所有XML生成的表结构数据。这里还需要说明一点的就是管理元数据需要一个单独的元数据库,也就是要求重新建立一个Oracle数据库,但是用C#代码创建Oracle数据库确实很有难度,所以我选择了一种比较巧妙的实现方式,就是把所有属于元数据的表用前缀标明(如metadata_名称),这样每次操作元数据库就只需要找到相应前缀的表就可以了,具体在元数据管理子系统有详细介绍实现方案。
因为XML文件里面包含有图片数据(经过64base编码的字符串表示),所以在处理XML文件需要先处理一下这个XML文件的图片字段,才有上面新建一个临时的XML文件,然后用数据集类对象读入XML数据,然后删除临时的XML文件。最后还是例如数据集适配器来插入元数据到Oracle数据库。
4.根据元数据的ID删除一条元数据(从Oracle数据库):
OracleCommand cmd = conn.CreateCommand();
cmd.Transaction = trans;
string sql = string.Empty;
//xxx_metadata
sql = "delete from " + strDatabaseName + "_metadata";
sql += " where mdid like'" + strMdid + "'";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
sql = "select metadata_id from " + strDatabaseName + "_metadata";
sql += " where mdid like'" + strMdid + "'";
OracleDataReader odr1 = sh.ReturnDataReader(sql);
if (odr1.Read())
{
//xxx_continfo
sql = "delete from " + strDatabaseName + "_continfo";
sql += " where metadata_id=" + odr1[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
sql = "select continfo_id from " + strDatabaseName + "_continfo";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataReader odr2 = sh.ReturnDataReader(sql);
if (odr2.Read())
{
//xxx_layerinfo
sql = "delete from " + strDatabaseName + "_layerinfo";
sql += " where continfo_id=" + odr2[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
//xxx_tableinfo
sql = "delete from " + strDatabaseName + "_tableinfo";
sql += " where continfo_id=" + odr2[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
//xxx_graph
sql = "delete from " + strDatabaseName + "_graph";
sql += " where metadata_id=" + odr1[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
//xxx_idpoc
sql = "delete from " + strDatabaseName + "_idpoc";
sql += " where metadata_id=" + odr1[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
sql = "select idpoc_id from " + strDatabaseName + "_idpoc";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataReader odr3 = sh.ReturnDataReader(sql);
if (odr3.Read())
{
//xxx_contact
sql = "delete from " + strDatabaseName + "_contact";
sql += " where idpoc_id=" + odr3[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
sql = "select contact_id from " + strDatabaseName + "_contact";
sql += " where idpoc_id=" + odr3[0].ToString();
OracleDataReader odr4 = sh.ReturnDataReader(sql);
if (odr4.Read())
{
//xxx_cntadd
sql = "delete from " + strDatabaseName + "_cntadd";
sql += " where contact_id=" + odr4[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
//xxx_cntphone
sql = "delete from " + strDatabaseName + "_cntphone";
sql += " where contact_id=" + odr4[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
sql = "select cntphone_id from " + strDatabaseName + "_cntphone";
sql += " where contact_id=" + odr4[0].ToString();
OracleDataReader odr5 = sh.ReturnDataReader(sql);
if (odr5.Read())
{
//xxx_voicenum
sql = "delete from " + strDatabaseName + "_voicenum";
sql += " where cntphone_id=" + odr4[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
}
}
//xxx_keyword
sql = "delete from " + strDatabaseName + "_keyword";
sql += " where metadata_id=" + odr1[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
//xxx_onlinesrc
sql = "delete from " + strDatabaseName + "_onlinesrc";
sql += " where metadata_id=" + odr1[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
sql = "select onlinesrc_id from " + strDatabaseName + "_onlinesrc";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataReader odr6 = sh.ReturnDataReader(sql);
if (odr6.Read())
{
//xxx_dtbrlinkage
sql = "delete from " + strDatabaseName + "_dtbrlinkage";
sql += " where onlinesrc_id=" + odr6[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
//xxx_dtdllinkage
sql = "delete from " + strDatabaseName + "_dtdllinkage";
sql += " where onlinesrc_id=" + odr6[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
//xxx_tpcat
sql = "delete from " + strDatabaseName + "_tpcat";
sql += " where metadata_id=" + odr1[0].ToString();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
try
{
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
LogHelp.writeLog(FrmMain.metaUsername, "元数据编辑", "删除元数据<" + strMdid + ">失败!");
MessageBox.Show("删除元数据<" + strMdid + ">失败!");
}
finally
{
conn.Close();
}
}
}
因为根据XSD文件解析生成的数据库表有十几个,所以对每一个表单独采用事务操作,就是这十几个表其实是一个整体,可以完整的表示一条元数据(元数据:描述数据的数据,这里就是描述空间数据特性的数据)。
5.根据元数据的ID从Oracle查询得到一条元数据,和删除一条元数据类似,也需要十几个表一起操作:
string sql = string.Empty;
//xxx_metadata
sql = "select * from " + strDatabaseName + "_metadata";
sql += " where mdid like'" + strMdid + "'";
OracleDataAdapter oda1 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda1.Fill(nds.Tables["metadata"]);
sql = "select metadata_id from " + strDatabaseName + "_metadata";
sql += " where mdid like'" + strMdid + "'";
OracleDataReader odr1 = sh.ReturnDataReader(sql);
if (odr1.Read())
{
//xxx_continfo
sql = "select * from " + strDatabaseName + "_continfo";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataAdapter oda2 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda2.Fill(nds.Tables["continfo"]);
sql = "select continfo_id from " + strDatabaseName + "_continfo";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataReader odr2 = sh.ReturnDataReader(sql);
if (odr2.Read())
{
//xxx_layerinfo
sql = "select * from " + strDatabaseName + "_layerinfo";
sql += " where continfo_id=" + odr2[0].ToString();
OracleDataAdapter oda8 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda8.Fill(nds.Tables["layerinfo"]);
//xxx_tableinfo
sql = "select * from " + strDatabaseName + "_tableinfo";
sql += " where continfo_id=" + odr2[0].ToString();
OracleDataAdapter oda9 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda9.Fill(nds.Tables["tableinfo"]);
}
//xxx_graph
sql = "select * from " + strDatabaseName + "_graph";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataAdapter oda3 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda3.Fill(nds.Tables["graph"]);
//xxx_idpoc
sql = "select * from " + strDatabaseName + "_idpoc";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataAdapter oda4 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda4.Fill(nds.Tables["idpoc"]);
sql = "select idpoc_id from " + strDatabaseName + "_idpoc";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataReader odr3 = sh.ReturnDataReader(sql);
if (odr3.Read())
{
//xxx_contact
sql = "select * from " + strDatabaseName + "_contact";
sql += " where idpoc_id=" + odr3[0].ToString();
OracleDataAdapter oda12 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda12.Fill(nds.Tables["contact"]);
sql = "select contact_id from " + strDatabaseName + "_contact";
sql += " where idpoc_id=" + odr3[0].ToString();
OracleDataReader odr4 = sh.ReturnDataReader(sql);
if (odr4.Read())
{
//xxx_cntadd
sql = "select * from " + strDatabaseName + "_cntadd";
sql += " where contact_id=" + odr4[0].ToString();
OracleDataAdapter oda13 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda13.Fill(nds.Tables["cntadd"]);
//xxx_cntphone
sql = "select * from " + strDatabaseName + "_cntphone";
sql += " where contact_id=" + odr4[0].ToString();
OracleDataAdapter oda14 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda14.Fill(nds.Tables["cntphone"]);
sql = "select cntphone_id from " + strDatabaseName + "_cntphone";
sql += " where contact_id=" + odr4[0].ToString();
OracleDataReader odr5 = sh.ReturnDataReader(sql);
if (odr5.Read())
{
//xxx_voicenum
sql = "select * from " + strDatabaseName + "_voicenum";
sql += " where cntphone_id=" + odr4[0].ToString();
OracleDataAdapter oda15 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda15.Fill(nds.Tables["voicenum"]);
}
}
}
//xxx_keyword
sql = "select * from " + strDatabaseName + "_keyword";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataAdapter oda5 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda5.Fill(nds.Tables["keyword"]);
//xxx_onlinesrc
sql = "select * from " + strDatabaseName + "_onlinesrc";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataAdapter oda6 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda6.Fill(nds.Tables["onlinesrc"]);
sql = "select onlinesrc_id from " + strDatabaseName + "_onlinesrc";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataReader odr6 = sh.ReturnDataReader(sql);
if (odr6.Read())
{
//xxx_dtbrlinkage
sql = "select * from " + strDatabaseName + "_dtbrlinkage";
sql += " where onlinesrc_id=" + odr6[0].ToString();
OracleDataAdapter oda10 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda10.Fill(nds.Tables["dtbrlinkage"]);
//xxx_dtdllinkage
sql = "select * from " + strDatabaseName + "_dtdllinkage";
sql += " where onlinesrc_id=" + odr6[0].ToString();
OracleDataAdapter oda11 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda11.Fill(nds.Tables["dtdllinkage"]);
}
//xxx_tpcat
sql = "select * from " + strDatabaseName + "_tpcat";
sql += " where metadata_id=" + odr1[0].ToString();
OracleDataAdapter oda7 = new OracleDataAdapter(sql,
ConfigurationSettings.AppSettings["ConnectionString"]);
oda7.Fill(nds.Tables["tpcat"]);
}
return nds;
}
6.导出Oracle数据库的数据到XML文件中
OracleDataReader odr = sh.ReturnDataReader(sql);
while (odr.Read())
{
string strMdid = odr[0].ToString();
//根据元数据的ID得到一条元数据
nds = GetOneMetaData(strMdid, strDatabaseName);
nds.WriteXml(strXmlPath + "\\" + strMdid + ".xml");
}
}
7.下面两个函数实现treeview控件向XML转换,主要用于对元数据的编辑后保存到XML文件中。
xmlDoc.Load(strXmlFilePath);
XmlNode xnRoot = xmlDoc.SelectSingleNode("metadata");
TransTreeToXml(xmlDoc, advTree.FindNodeByName("metadata").Nodes, (XmlElement)xnRoot, strXmlFilePath);
}
/// <summary>
/// 转化Tree节点的数据到XML文档
/// </summary>
/// <param name="xmlDoc">XML文档对象</param>
/// <param name="nodes">Tree的节点集合</param>
/// <param name="xeRoot">根节点元素</param>
/// <param name="strXmlPath">XML的节点路径</param>
private static void TransTreeToXml(XmlDocument xmlDoc,
NodeCollection nodes, XmlElement xeRoot, String strXmlPath)
{
XmlElement xe;
//遍历节点集合中的所有节点
foreach (Node node in nodes)
{
//根据节点的名称创建一个新的XML节点元素
xe = xmlDoc.CreateElement(node.Name);
//将新建的XML节点元素添加到父亲节点(也就是传递进来的根节点)
xeRoot.AppendChild(xe);
//如果节点还有子节点就递归调用本函数
if (node.Nodes.Count > 0)
{
TransTreeToXml(xmlDoc, node.Nodes, xe, strXmlPath);
}
else
{
//因为Tree节点数据的格式是:(名称:值),所以根据格式取出具体的值
string strTemp = node.Text.Substring(node.Text.IndexOf(':')+1);
//这个值不是空就填写新建的XML节点的值
if (strTemp != "")
{
//特殊处理graphOverview节点,因为它涉及到图形的二进制数据,需要转化为字符串
if (xe.Name == "graphOverview")
{
//以下就是将图形二进制数据转化为字符串
Bitmap bmp = new Bitmap(strTemp);
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
String strbaser64 = Convert.ToBase64String(arr);
//给节点填充值
xe.InnerText = strbaser64;
}
else
{
//给节点填充值
xe.InnerText = strTemp;
}
}
}
}
xmlDoc.Save(strXmlPath);
}
#endregion
8.遍历XML并实现向tree控件的转化
/// <summary>
/// 递归转化XML文件的节点到Tree的节点
/// </summary>
/// <param name="xmlNodes">XML文件的节点集合</param>
/// <param name="advTree">Tree控件</param>
private static void TransXMLToTree(XmlNodeList xmlNodes, AdvTree advTree)
{
//循环遍历节点集合
foreach (XmlNode xn in xmlNodes)
{
//根据XML的节点找到对于的Tree节点
Node n = advTree.FindNodeByName(xn.Name);
//如果还有子节点就递归转换
if (n.HasChildNodes)
{
TransXMLToTree(xn.ChildNodes, advTree);
}
else
{
//如果节点的内容不为空就为Tree控件节点添加值
if (xn.InnerText != "")
{
//标记已经有值,方便以后对Tree的编辑操作
n.Tag = "yes";
n.Text += xn.InnerText;
//如果此节点有父亲节点就把对于的父亲节点也标记为有值
while (n.Parent != null)
{
Node np = n.Parent;
np.Tag = "yes";
n = n.Parent;
}
}
}
}
}
#endregion
9.将DataGridView显示的内容导出Excel
for (int j = 0, k = 0; j < iTrueCols; j++)
{
//省略Visible = false的列
if (m_DataView.Columns[j].Visible)
{
dimArray[0, k] = m_DataView.Columns[j].HeaderText;
k++;
}
}
for (int i = 0; i < iRows; i++)
{
for (int j = 0, k = 0; j < iTrueCols; j++)
{
//省略Visible = false的列
if (m_DataView.Columns[j].Visible)
{
if (m_DataView.Rows[i].Cells[j].Value != null)
{
dimArray[i + 1, k] = m_DataView.Rows[i].Cells[j].Value.ToString();
}
k++;
}
}
}
ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Value2 = dimArray;
ws.get_Range(ws.Cells[1, 1], ws.Cells[1, iCols]).Font.Bold = true;
ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).Font.Size = 10.0;
ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]).RowHeight = 14.25;
//ws.Columns[.ColumnWidth = datagridview.Columns[0].Width;
for (int j = 0, k = 0; j < iTrueCols; j++)
{
//省略Visible = false的列
if (m_DataView.Columns[j].Visible)
{
ws.get_Range(ws.Cells[1, k + 1], ws.Cells[1, k + 1]).ColumnWidth =
(m_DataView.Columns[j].Width / 8.4) > 255 ? 255 : (m_DataView.Columns[j].Width / 8.4);
//ws.Columns.c = datagridview.Columns[j].Width;
k++;
}
}
}
//设置禁止弹出保存和覆盖的询问提示框
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
app.Visible = false;
//保存工作簿
try
{
app.Save("temp");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
app.UserControl = false;
app.Quit();
File.Delete("temp.xlwx");
}
}
10.excel数据导入到DataGridView控件中
//根据Excel的行逐一对上面构造的DataTable的列进行赋值
foreach (DataRow excelRow in ds.Tables[0].Rows)
{
int i = 0;
DataRow dr = ((System.Data.DataTable)dgv.DataSource).Rows.Add();
for (i = 0; i < ds.Tables[0].Columns.Count; ++i)
{
dr[i + 1] = excelRow[i];
}
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
}
11.数据备份与恢复
// 关闭shell的使用
p.StartInfo.UseShellExecute = false;
//p.StartInfo.RedirectStandardInput = true;
// 设置显示cmd运行界面
p.StartInfo.CreateNoWindow = false;
// 启动进程
p.Start();
p.WaitForExit();
p.Dispose();
result = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
return result;
}
总结:这些功能放在一个类中可能不是很合理,但是当时是为了自己编程的方便,只要有多处实现的一些独立的功能,我就加入到这个类中来,并全部用静态的方法实现。