SQL Server 提供了一个非常好用的客户端检索工具-查询分析器,但是美中不足的是查询分析器无法对XML查询给出很好的结果,用户无法完整查看XML结果集。上学期给IBM电子商务班讲XML与WebService时,不得不自己写了一个程序执行XML检索。虽然程序实在有些简陋,但毕竟可以完成课堂演示的要求。
程序主体是通过sqlCommand的ExecuteXmlReader方法完成的。我添加了一些对特殊字符的MIME编码(这一部分应当有现成代码,不过我没有找到,只好自己将就着写了),以及XML格式处理功能。先贴上一些代码,具体可以自己下载后看。希望多提宝贵意见。
关键代码:
数据库连接可以通过修改 XML_Search.exe.config 文件实现。程序对本地默认SQL实例的Northwind数据库执行XML查询。代码下载请点这里。
程序主体是通过sqlCommand的ExecuteXmlReader方法完成的。我添加了一些对特殊字符的MIME编码(这一部分应当有现成代码,不过我没有找到,只好自己将就着写了),以及XML格式处理功能。先贴上一些代码,具体可以自己下载后看。希望多提宝贵意见。
关键代码:
private void btnSearch_Click(object sender, System.EventArgs e)
{
string s = "<?xml version="1.0" encoding="utf-8"?><SearchResult>";
string endWith = "";
// 创建连接对象实例
SqlConnection myConnection =
new SqlConnection(ConfigurationSettings.AppSettings["ConnectString"]);
SqlCommand myCommand = new SqlCommand(txtCondition.Text, myConnection);
myCommand.CommandType = CommandType.Text;
// 创建 XML Reader,并读取数据到 XML 字符串中
XmlTextReader xmlReader = null;
try
{
// 打开数据库连接
myConnection.Open();
// 运行存储过程并初始化 XmlReader
xmlReader = (XmlTextReader)myCommand.ExecuteXmlReader();
while(xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
s += "<" + xmlReader.Name;
if (xmlReader.IsEmptyElement)
endWith ="/";
else
endWith = "";
if (xmlReader.HasAttributes)
{
while(xmlReader.MoveToNextAttribute())
s += " " + xmlReader.Name + "="" + ToMIMEString(xmlReader.Value) + """;
}
s += endWith + ">";
}
else if (xmlReader.NodeType == XmlNodeType.EndElement)
{
s += "</" + xmlReader.Name + ">";
}
else if (xmlReader.NodeType == XmlNodeType.Text)
{
if (xmlReader.Value.Length != 0)
{
s += ToMIMEString(xmlReader.Value);
}
}
}
s+="</SearchResult>";
txtResult.Text = s;
}
catch (Exception)
{
txtResult.Text = "Got an error";
//不处理任何错误
}
finally
{
// 关闭数据库连接并清理 reader 对象
myConnection.Close();
xmlReader = null;
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(s);
//=============================================
//将结果写入
//=============================================
try
{
MemoryStream ms = new MemoryStream();
XmlTextWriter xtw = new XmlTextWriter(ms, Encoding.UTF8);
xtw.Formatting = Formatting.Indented;
xmlDoc.Save(xtw);
byte[] buf = ms.ToArray();
txtResult.Text = Encoding.UTF8.GetString(buf,0,buf.Length);
xtw.Close();
}
catch
{
txtResult.Text = "出现错误!";
}
}
private string ToMIMEString(string s)
{
StringBuilder sb = new StringBuilder();
char[] source = s.ToCharArray();
foreach(char c in source)
{
if(c=='<')
sb.Append("<");
else if(c=='&')
sb.Append("&");
else if(c=='>')
sb.Append(">");
else if(c=='"')
sb.Append(""");
else
sb.Append(c);
}
return sb.ToString();
}
{
string s = "<?xml version="1.0" encoding="utf-8"?><SearchResult>";
string endWith = "";
// 创建连接对象实例
SqlConnection myConnection =
new SqlConnection(ConfigurationSettings.AppSettings["ConnectString"]);
SqlCommand myCommand = new SqlCommand(txtCondition.Text, myConnection);
myCommand.CommandType = CommandType.Text;
// 创建 XML Reader,并读取数据到 XML 字符串中
XmlTextReader xmlReader = null;
try
{
// 打开数据库连接
myConnection.Open();
// 运行存储过程并初始化 XmlReader
xmlReader = (XmlTextReader)myCommand.ExecuteXmlReader();
while(xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
s += "<" + xmlReader.Name;
if (xmlReader.IsEmptyElement)
endWith ="/";
else
endWith = "";
if (xmlReader.HasAttributes)
{
while(xmlReader.MoveToNextAttribute())
s += " " + xmlReader.Name + "="" + ToMIMEString(xmlReader.Value) + """;
}
s += endWith + ">";
}
else if (xmlReader.NodeType == XmlNodeType.EndElement)
{
s += "</" + xmlReader.Name + ">";
}
else if (xmlReader.NodeType == XmlNodeType.Text)
{
if (xmlReader.Value.Length != 0)
{
s += ToMIMEString(xmlReader.Value);
}
}
}
s+="</SearchResult>";
txtResult.Text = s;
}
catch (Exception)
{
txtResult.Text = "Got an error";
//不处理任何错误
}
finally
{
// 关闭数据库连接并清理 reader 对象
myConnection.Close();
xmlReader = null;
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(s);
//=============================================
//将结果写入
//=============================================
try
{
MemoryStream ms = new MemoryStream();
XmlTextWriter xtw = new XmlTextWriter(ms, Encoding.UTF8);
xtw.Formatting = Formatting.Indented;
xmlDoc.Save(xtw);
byte[] buf = ms.ToArray();
txtResult.Text = Encoding.UTF8.GetString(buf,0,buf.Length);
xtw.Close();
}
catch
{
txtResult.Text = "出现错误!";
}
}
private string ToMIMEString(string s)
{
StringBuilder sb = new StringBuilder();
char[] source = s.ToCharArray();
foreach(char c in source)
{
if(c=='<')
sb.Append("<");
else if(c=='&')
sb.Append("&");
else if(c=='>')
sb.Append(">");
else if(c=='"')
sb.Append(""");
else
sb.Append(c);
}
return sb.ToString();
}
数据库连接可以通过修改 XML_Search.exe.config 文件实现。程序对本地默认SQL实例的Northwind数据库执行XML查询。代码下载请点这里。