C#通过HTTP操作数据的模块
// 本程序提供了一个通过HTTP来操作数据库的类,这样少了本地安装乱七八糟的数据库驱动程序及复杂的设置,
// Web 服务器可以是任意的类型的,可以为 ASP , ASP.NETJSP 或其他,本模块提供了服务器的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 ;
}
return -1 ;
}// ToXML
///
/// 从XML元素加载对象数据
///
/// XML节点
/// 加载的数据的行数
public int FromXML( System.XML.XMLElement RootElement )
{
System.XML.XMLElement RowElement = null;
strHead = null;
myRows.Clear();
intRowIndex = -1 ;
if( RootElement == null ) return -1 ;
// 获得列信息
System.Collections.ArrayList myHeads = new System.Collections.ArrayList();
for( int iCount = 0 ; iCount < 255 ; iCount ++ )
{
if( RootElement.HasAttribute( "f" + iCount.ToString()))
{
string strName = RootElement.GetAttribute("f" + iCount.ToString());
myHeads.Add( strName.ToLower().Trim());
}
else
break;
}
//strHead = new string[ myHeads.Count ];
strHead = ( string[]) myHeads.ToArray( typeof(string));
// 获得数据
foreach( System.XML.XMLNode myNode in RootElement.ChildNodes )
{
if( myNode is System.XML.XMLElement )
{
RowElement = ( System.XML.XMLElement ) myNode ;
// 获得数据
string[] strValues = new string[ strHead.Length];
myRows.Add( strValues );
int iFieldCount = 0 ;
foreach(System.XML.XMLNode myFieldNode in RowElement.ChildNodes)
{
if( myFieldNode is System.XML.XMLElement )
{
strValues[iFieldCount] = ( myFieldNode.InnerText == c_NullFlag ? null : myFieldNode.InnerText ) ;
iFieldCount ++ ;
}
}// foreach
}// if
}// foreach
return myRows.Count ;
}// FromXML
#region IDataReader 成员
///
/// 未实现
///
public int RecordsAffected
{
get {return 0; }
}
///
/// 已重载:关闭对象
///
public bool IsClosed
{
get{ return bolClosed ; }
}
///
/// 未实现
///
///
public bool NextResult()
{
if( myRows == null || (intRowIndex+1) >= myRows.Count )
return false;
else
return true;
}
///
/// 已重载:关闭对象
///
public void Close()
{
bolClosed = true;
strHead = null;
myRows = null;
}
///
/// 移动当前记录到下一行
///
///
public bool Read()
{
intRowIndex ++ ;
if( intRowIndex >= myRows.Count )
return false;
else
return true;
}
///
/// 已重载:不支持
///
public int Depth
{
get{ return 0; }
}
///
/// 已重载:不支持
///
///
public System.Data.DataTable GetSchemaTable()
{
// TODO: 添加 XMLHttpReader.GetSchemaTable 实现
return null;
}
#endregion
#region IDisposable 成员
public void Dispose()
{
// TODO: 添加 XMLHttpReader.Dispose 实现
}
#endregion
#region IDataRecord 成员
///
/// 已重载:获得指定列号的整数型数据
///
/// 从0开始的列号
/// 转换成功的整形数据
public int GetInt32(int i)
{
return Convert.ToInt32( this.GetString(i));
}
///
/// 获得指定列名的数据
///
// Web 服务器可以是任意的类型的,可以为 ASP , ASP.NETJSP 或其他,本模块提供了服务器的ASP.NET 的
// 例子
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 ;
}
return -1 ;
}// ToXML
///
/// 从XML元素加载对象数据
///
/// XML节点
/// 加载的数据的行数
public int FromXML( System.XML.XMLElement RootElement )
{
System.XML.XMLElement RowElement = null;
strHead = null;
myRows.Clear();
intRowIndex = -1 ;
if( RootElement == null ) return -1 ;
// 获得列信息
System.Collections.ArrayList myHeads = new System.Collections.ArrayList();
for( int iCount = 0 ; iCount < 255 ; iCount ++ )
{
if( RootElement.HasAttribute( "f" + iCount.ToString()))
{
string strName = RootElement.GetAttribute("f" + iCount.ToString());
myHeads.Add( strName.ToLower().Trim());
}
else
break;
}
//strHead = new string[ myHeads.Count ];
strHead = ( string[]) myHeads.ToArray( typeof(string));
// 获得数据
foreach( System.XML.XMLNode myNode in RootElement.ChildNodes )
{
if( myNode is System.XML.XMLElement )
{
RowElement = ( System.XML.XMLElement ) myNode ;
// 获得数据
string[] strValues = new string[ strHead.Length];
myRows.Add( strValues );
int iFieldCount = 0 ;
foreach(System.XML.XMLNode myFieldNode in RowElement.ChildNodes)
{
if( myFieldNode is System.XML.XMLElement )
{
strValues[iFieldCount] = ( myFieldNode.InnerText == c_NullFlag ? null : myFieldNode.InnerText ) ;
iFieldCount ++ ;
}
}// foreach
}// if
}// foreach
return myRows.Count ;
}// FromXML
#region IDataReader 成员
///
/// 未实现
///
public int RecordsAffected
{
get {return 0; }
}
///
/// 已重载:关闭对象
///
public bool IsClosed
{
get{ return bolClosed ; }
}
///
/// 未实现
///
///
public bool NextResult()
{
if( myRows == null || (intRowIndex+1) >= myRows.Count )
return false;
else
return true;
}
///
/// 已重载:关闭对象
///
public void Close()
{
bolClosed = true;
strHead = null;
myRows = null;
}
///
/// 移动当前记录到下一行
///
///
public bool Read()
{
intRowIndex ++ ;
if( intRowIndex >= myRows.Count )
return false;
else
return true;
}
///
/// 已重载:不支持
///
public int Depth
{
get{ return 0; }
}
///
/// 已重载:不支持
///
///
public System.Data.DataTable GetSchemaTable()
{
// TODO: 添加 XMLHttpReader.GetSchemaTable 实现
return null;
}
#endregion
#region IDisposable 成员
public void Dispose()
{
// TODO: 添加 XMLHttpReader.Dispose 实现
}
#endregion
#region IDataRecord 成员
///
/// 已重载:获得指定列号的整数型数据
///
/// 从0开始的列号
/// 转换成功的整形数据
public int GetInt32(int i)
{
return Convert.ToInt32( this.GetString(i));
}
///
/// 获得指定列名的数据
///