可执行个性化存储过程的数据访问层(DAL) (C#实现)

        本文意在解释如何从应用层执行单条或者批量的存储过程(主要调用没有任何结果集返回的存储储过程,当然也可以拓展到调用有结果集返回的存储过程).

数据访问层:
  本层主要包括有下列成员:
  • ParamData 结构
  • StoredProcedure 类
  • StoredProcedureCollection 类
  • Execute 类

其中ParamData 含有存储过程参数的名称,值,以及各自的数据类型.

 1struct ParamData
 2{
 3public string pName,pValue;
 4public SqlDbType pDataType;
 5public ParamData(string pName,SqlDbType pDataType,string pValue)
 6{
 7this.pName=pName;
 8this.pDataType=pDataType;
 9this.pValue=pValue;
10}

11}

12

StoredProcedure 含有SetParam 和 Getparam两大方法,他们分别用来设置和获取存储过程的参数列表的.

public void SetParam(string pName,SqlDbType pDataType,string pValue)
{
ParamData pData
=new ParamData(pName,pDataType,pValue);
// adding to array list sParams.
sParams.Add(pData);
}



public ArrayList GetParams()
{
if (!(sParams==null))
{
return sParams;
}

else
{
return null;
}

}

StoredProcedureCollection类 是一个集合类, 它含有多个Stored Procedure以及Add和Remove,Item方法.

public void add(StoredProcedure value)
{
List.Add(value);
}

public void Remove(int index)
{
if (index > Count - 1 || index < 0)
{
Console.WriteLine(
"No data to remove");
}

else
{
List.RemoveAt(index); 
}

}



public StoredProcedure Item(int Index)
{
return (StoredProcedure) List[Index];
}

Execute 类 包括有一个ExecuteSps 静态方法,它主要执行来自StoredProcedureCollection类的存储过程

public static bool ExecuteSps(StoredProcedureCollection spCollection,SqlConnection Connection)
{
try
{
foreach(StoredProcedure spData in spCollection)
{
SqlCommand cmd
=new SqlCommand();
int i=0;
if (Connection.State!= ConnectionState.Open)
Connection.Open();
cmd.Connection
=Connection; cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText
=spData.ProcName;
IEnumerator myEnumerator 
= spData.GetParams().GetEnumerator();
while (myEnumerator.MoveNext())
{
ParamData pData
=(ParamData)myEnumerator.Current;
cmd.Parameters.Add(pData.pName,pData.pDataType);
cmd.Parameters[i].Value
=pData.pValue;
i
=i+1;
}
cmd.ExecuteNonQuery();
}
return true
}
catch(Exception exc)
{
return false;
}
}

更多实现细节,见 DataAccessLayer.ZIP
应用层:
在应用层我们添加对DataAccessLayer.dll的引用后,我们就可以随意地在需要的地方调用数据层的功能.这样做的一大优势就是:我们可以随着存储过程需求的变化,来添加和删除任意多的参数.

 1private void button1_Click(object sender, System.EventArgs e)
 2{
 3SqlConnection connection=new SqlConnection();
 4//change this connect string as per your environment
 5string connectString="Persist Security Info=False;Integrated Security=SSPI;database=DB1;server=Server2;Connect Timeout=60";
 6connection.ConnectionString=connectString;
 7if (connection.State!=ConnectionState.Open)
 8connection.Open();
 9DataAccessLayer.StoredProcedureCollection spCollection=new DataAccessLayer.StoredProcedureCollection();
10DataAccessLayer.StoredProcedure spData=new DataAccessLayer.StoredProcedure();
11spData.ProcName=txtSpName.Text;
12spData.SetParam(txtParam1.Text,SqlDbType.VarChar,txtParamValue1.Text);
13spData.SetParam(txtParam2.Text,SqlDbType.VarChar,txtParamValue2.Text);
14spCollection.add(spData);
15if (DataAccessLayer.Execute.ExecuteSps(spCollection,connection))
16MessageBox.Show("Successfully executed");
17}
 
18}
19catch(Exception exc)
20{
21return false;
22}

23}
更多实现细节  见 CallingAPP.zip
posted @ 2005-10-23 14:50 Kevin Li 阅读(1760) 评论(11)  编辑 收藏 所属分类: 外文翻译

  回复  引用  查看    
#1楼 2005-10-23 21:41 | 秋日私语      
请问你的代码是怎么贴上去的,跟编辑器里的样子一样?
  回复  引用  查看    
#2楼 [楼主]2005-10-23 21:51 | finesite      
你插入代码的时候 在编辑器的右上方 有个 代码 的字样 ,在弹出的对话框里 你可以选择是否显示行号,是否允许折叠...
  回复  引用    
#3楼 2005-10-24 08:16 | 泽来- [未注册用户]
好像少好很多关联的东西
希望加全
谢谢
  回复  引用  查看    
#4楼 2005-10-24 10:21 | 轻舞.net      
怎么不提供下载呢?参考参考。。
  回复  引用    
#5楼 2005-10-24 11:34 | 新小鱼儿 :) [未注册用户]
你的东东太简单了,看看人家 http://smartsoft2005.cnblogs.com 的 HyperDAL 同样支持存储过程,功能很强大呀 :)
  回复  引用  查看    
#6楼 [楼主]2005-10-24 12:23 | finesite      
楼上的朋友,可以提供下载了

to 新小鱼儿: 谢谢提供,值得学习学习! 毕竟人家那个是商业软件嘛 :)

  回复  引用    
#7楼 2005-10-24 16:00 | ofei [未注册用户]
简单哦 起码没提供参数方向!
  回复  引用  查看    
#8楼 [楼主]2005-10-24 19:02 | finesite      
呵呵,开始不是说了嘛,返回结果集的完全自己可以拓展的.
  回复  引用  查看    
#9楼 2006-06-20 13:42 | 三月      
呵呵
非常好~~帮你转载^0^
  回复  引用    
#10楼 2008-04-07 10:53 | xiangyu [未注册用户]
string connectString="Persist Security Info=False;Integrated Security=SSPI;database=DB1;server=Server2;Connect Timeout=60";
6connection.ConnectionString=connectString;
应用层可以有这些东西么 ms没有用到业务逻辑层的封装啊
  回复  引用  查看    
#11楼 2008-05-28 08:58 | 求知无傲      
支持

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-27 16:16 编辑过
成果网帮您增加网站收入


相关链接: