使用 XML 和辅助类自动化查询执行






1.60/5 (2投票s)
2006年6月26日
3分钟阅读

17519
该通用类具有返回 dataset 和 datareader 对象的静态函数,它接受一个字符串(存储查询的 xml 标签名称)和一个值,以在查询接受参数时提供。
引言
用于存储查询和存储过程的 XML 文件。下面的 XML 文件有两个主要标签:SqlQuery 和 StoredProc。
您可以将查询与标签名关联,并将所需的查询存储在 Query 属性中。如果查询有任何参数,则创建相同数量的子节点,并在子标签的 Parameter 属性和 DataType 属性中指定 ParameterName 和 sqldatatype。
(注意:此 xml 文件是为使用 sqlclient 提供程序并以 sqlserver 2000 为目标的查询创建的,如果使用的提供程序是 oledb,则查询可以使用“?”而不是显式指定参数名后跟 @)
<pre>
<?xml version="1.0" encoding="utf-8"?>
<查询>
<SqlQuery>
<LoginClient 查询="select chrid,chrname from yourtable where UserName=@UserName and pwd =@Password">
<LoginClientParam 参数="@UserName" DataType="SqlDbType.VarChar">
</LoginClientParam>
<LoginClientParam 参数="@Password" DataType="SqlDbType.VarChar">
</LoginClientParam>
</LoginClient>
<LoginSubscriber 查询="select chrid,chrname from yourtable where UserName=@UserName and pwd =@Password">
<LoginSubscriberParam 参数="@UserName" DataType="SqlDbType.VarChar">
</LoginSubscriberParam>
<LoginSubscriberParam 参数="@Password" DataType="SqlDbType.VarChar">
</LoginSubscriberParam>
</LoginSubscriber>
<LoginRM 查询="Select usr_id from yourtable where Usr_Name = @UserName and pwd =@Password">
<LoginRMParam 参数="@UserName" DataType="SqlDbType.VarChar">
</LoginRMParam>
<LoginRMParam 参数="@Password" DataType="SqlDbType.VarChar">
</LoginRMParam>
</LoginRM>
<LoginBackUser 查询="abc">
</LoginBackUser>
<TradeRegStockNameData 查询="select distinct chrDesc,chrDesc as chrDesc2 from yourtable where bitdelete=0">
</TradeRegStockNameData>
</SqlQuery>
<StoredProc>
<TradeReg 查询="YourStoredProcedure">
<TradeRegParam 参数="@mSub_Ac_id" DataType="SqlDbType.Char" DataLen="10">
</TradeRegParam>
<TradeRegParam 参数="@mClient_id" DataType="SqlDbType.Char" DataLen="10">
</TradeRegParam>
<TradeRegParam 参数="@mSettType" DataType="SqlDbType.Char" DataLen="255">
</TradeRegParam>
<TradeRegParam 参数="@mFromDate" DataType="SqlDbType.Char" DataLen="10">
</TradeRegParam>
<TradeRegParam 参数="@mToDate" DataType="SqlDbType.Char" DataLen="10">
</TradeRegParam>
<TradeRegParam 参数="@mSettFromDate" DataType="SqlDbType.Char" DataLen="10">
</TradeRegParam>
<TradeRegParam 参数="@mSettToDate" DataType="SqlDbType.Char" DataLen="10">
</TradeRegParam>
<TradeRegParam 参数="@mStockName" DataType="SqlDbType.Char" DataLen="255">
</TradeRegParam>
<TradeRegParam 参数="@mTradeType" DataType="SqlDbType.Char" DataLen="1">
</TradeRegParam>
<TradeRegParam 参数="@mBuySell" DataType="SqlDbType.Char" DataLen="1">
</TradeRegParam>
<TradeRegParam 参数="@mUser_Ac_id" DataType="SqlDbType.Char" DataLen="10">
</TradeRegParam>
<TradeRegParam 参数="@UsrType" DataType="SqlDbType.Int">
</TradeRegParam>
</TradeReg>
</StoredProc>
</查询>
</pre>
使用 XML 文件的支持类
<pre>
usingSystem;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Drawing;
usingSystem.Xml;
usingSystem.Web;
命名空间kmukWebFII
{
/// <summary>
///FetchDataSqlClient 的摘要描述。
/// </summary>
public 类FetchDataSqlClient
{
public static 字符串GetFastMultipleParamTrial(字符串xmlTagName,params 字符串[] val)
{
XmlDocument _xdoc =newXmlDocument();
_xdoc.Load( HttpContext.Current.Server.MapPath("KmukQueries.xml"));
XmlNodeList xtemp = _xdoc.GetElementsByTagName(xmlTagName);
SqlConnection dbconn =newSqlConnection(ConfigurationSettings.AppSettings["Kmukconn2"]);
//string sqlCommand = xtemp[0].Attributes["Query"].Value;
SqlCommand dbcmd =newSqlCommand();
dbcmd.Connection = dbconn;
dbcmd.CommandText = xtemp[0].Attributes["Query"].Value;
// 如果代码中存在参数,则将执行此段代码
if(val[0]!="null")
{
inticount = 0;
foreach(XmlNode xnodtempinxtemp[0].ChildNodes )
{
字符串paramname = xnodtemp.Attributes["Parameter"].Value;
字符串paramtype = xnodtemp.Attributes["DataType"].Value;
dbcmd.Parameters.Add(paramname,paramtype);
dbcmd.Parameters[paramname].Value = val[icount];
icount++;
}
}
SqlDataReader rset=null;
boolerrorocc =true;
try
{
dbconn.Open();
rset = dbcmd.ExecuteReader();
}
catch(Exception e)
{
e.ToString();
errorocc =false;
}
finally
{
dbconn.Close();
}
// catch(SqlException se)
// {
// //if(rset!="")
// // dbconn.Close();
//
// if(NUM_TRIES<MAX_TRIES)
// {
// rset = dbcmd.ExecuteScalar().ToString();
// NUM_TRIES+=1;
// }
// else
// throw se;
//
// }
if(errorocc!=false)
returnrset;
else
return "-1";
}
</pre>
代码中的使用示例
假设我们使用这个静态类返回一个 datareader 对象。
//aspx 页面的代码隐藏
datareader drtemp;
drtemp =FetchDataSqlClient.GetFastSingleParamTrial("LoginClient",dbconn,txtusernamec.Text,txtpasswordc.Text);
上述函数的签名(“string xmlTagName”, oledbconnection 对象, 参数)
这是我为 Code Project 做的第一次贡献。
希望很快能带着改进的功能和代码回来。