First we try, then we trust

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
SQL Server 提供了一个非常好用的客户端检索工具-查询分析器,但是美中不足的是查询分析器无法对XML查询给出很好的结果,用户无法完整查看XML结果集。上学期给IBM电子商务班讲XML与WebService时,不得不自己写了一个程序执行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(
"&lt;");
    
else if(c=='&')
      sb.Append(
"&amp;");
    
else if(c=='>')
      sb.Append(
"&gt;");
    
else if(c=='"')
      sb.Append(
"&quot;");
    
else
      sb.Append(c);
  }

  
return sb.ToString();
}


数据库连接可以通过修改 XML_Search.exe.config 文件实现。程序对本地默认SQL实例的Northwind数据库执行XML查询。代码下载请点这里
posted on 2004-09-12 21:06  吕震宇  阅读(4686)  评论(1编辑  收藏  举报