日期:2013-04-25  浏览次数:20580 次

// 本程序提供了一个通过HTTP来操作数据库的类,这样少了本地安装乱七八糟的数据库驱动程序及复杂的设置,
// Web 服务器可以是任意的类型的,可以为 ASP , ASP.NET JSP 或其他,本模块提供了服务器的ASP.NET 的
// 例子
// 南京千里独行原创 请引用时勿删除本行 2004-12-31
using System;
using System.Net ;
namespace myConnection
{
///
/// XMLHttp数据库连接操作事件处理委托
///
/// 数据库连接对象
/// 数据库命令对象
/// 总的数据字节数
/// 已完成的数据字节数
public delegate void XMLHttpDBExecutingHandler( XMLHttpConnection conn , XMLHttpCommand cmd , long ContentLength , long ContentCompleted );
///
/// XMLHttp类型的数据库数据读取对象
///
public class XMLHttpReader : System.Data.IDataReader
{
private string[] strHead = null;
private System.Collections.ArrayList myRows = new System.Collections.ArrayList();
private bool bolClosed = false;
private int intRowIndex = 0 ;
private const string c_NullFlag = "[NULL]" ;

///
/// 根据字段名称获得字段序号,比较不区分大小写
///
/// 字段名称
/// 字段的从0开始的序号,若没找到则返回-1
public int GetIndexByName( string strName )
{
if( strName == null ) return -1 ;
strName = strName.ToUpper().Trim();
for( int iCount = 0 ; iCount < strHead.Length ; iCount ++ )
if( strName.Equals( strHead[iCount]))
return iCount ;
return -1 ;
}

///
/// 从一个数据库读取对象加载对象数据
///
/// 数据库数据读取对象
/// 加载的记录的行数
public int FromReader(System.Data.IDataReader myReader)
{
if( myReader != null)
{
// 加载列头信息
strHead = new string[ myReader.FieldCount ];
for( int iCount = 0 ; iCount < myReader.FieldCount ; iCount ++ )
strHead[iCount] = myReader.GetName(iCount).ToLower().Trim();
// 加载数据
myRows.Clear();
intRowIndex = -1 ;
while( myReader.Read())
{
string[] strValues = new string[ myReader.FieldCount];
myRows.Add( strValues );
for( int iCount = 0 ; iCount < myReader.FieldCount ;iCount ++ )
{
if( myReader.IsDBNull( iCount ) == false)
{
if( myReader[iCount] is byte[])
{
strValues[iCount] = Convert.ToBase64String( (byte[])myReader[iCount]);
}
else
strValues[iCount] = myReader[iCount].ToString();
}
}// for
}// while
return myRows.Count ;
}// if
return -1;
}// FromReader
///
/// 保存对象数据到XML节点
///
/// 根XML节点
/// 保存的记录个数
public int ToXML( System.Xml.XmlElement RootElement )
{
System.Xml.XmlElement RowElement = null;
System.Xml.XmlElement FieldElement = null;
while( RootElement.FirstChild != null)
RootElement.RemoveChild( RootElement.FirstChild);
// 保存列数据
if( strHead != null && strHead.Length > 0 )
{
for( int iCount = 0 ; iCount < strHead.Length ;iCount ++ )
{
RootElement.SetAttribute("f" + iCount.ToString() , strHead[iCount]);
}
RootElement.SetAttribute("fieldcount" , strHead.Length.ToString());
}
// 保存数据
if( myRows != null && myRows.Count > 0 )
{
System.Xml.XmlDocument myDoc = RootElement.OwnerDocument ;
for( int RowCount = 0 ; RowCount < myRows.Count ; RowCount ++ )
{
string[] strValue = ( string[] ) myRows[RowCount];
RowElement = myDoc.CreateElement("r");
RootElement.AppendChild( RowElement );
for( int iCount = 0 ; iCount < strValue.Length ; iCount ++ )
{
FieldElement = myDoc.CreateElement("f" + iCount.ToString());
RowElement.AppendChild( FieldElement );
if( strValue[iCount] == null )
FieldElement.InnerText = c_NullFlag ;
else
FieldElement.InnerText = strValue[iCount];
}
}// for
return myRows.Count ;
}