C#如何实现SQL封装
这篇文章给大家分享的是有关C#如何实现SQL封装的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
SQLHelper.as , 代码如下:
usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Configuration;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Linq;usingSystem.Web;namespaceDBDome{///此类为抽象类,///不允许实例化,在应用时直接调用即可///</summary>publicsealedclassSqlHelper{privateSqlHelper(){}///<summary>///数据库连接字符串///</summary>publicstaticreadonlystringconnectionString=ConfigurationManager.ConnectionStrings["con"].ToString();//HashtabletostorecachedparametersprivatestaticHashtableparmCache=Hashtable.Synchronized(newHashtable());#region//ExecteNonQuery方法///<summary>///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。///使用参数数组形式提供参数列表///</summary>///<paramname="connectionString">一个有效的数据库连接字符串</param>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>publicstaticintExecteNonQuery(stringconnectionString,CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){SqlCommandcmd=newSqlCommand();using(SqlConnectionconn=newSqlConnection(connectionString)){//通过PrePareCommand方法将参数逐个加入到SqlCommand的参数集合中PrepareCommand(cmd,conn,null,cmdType,cmdText,commandParameters);intval=cmd.ExecuteNonQuery();//清空SqlCommand中的参数列表cmd.Parameters.Clear();returnval;}}///<summary>///执行一个不需要返回值的SqlCommand命令,通过指定专用的连接字符串。///使用参数数组形式提供参数列表///</summary>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>publicstaticintExecteNonQuery(CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){returnExecteNonQuery(connectionString,cmdType,cmdText,commandParameters);}///<summary>///存储过程专用///</summary>///<paramname="cmdText">存储过程的名字</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>publicstaticintExecteNonQueryProducts(stringcmdText,SqlParameter[]commandParameters){returnExecteNonQuery(CommandType.StoredProcedure,cmdText,commandParameters);}///<summary>///Sql语句专用///</summary>///<paramname="cmdText">T_Sql语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个数值表示此SqlCommand命令执行后影响的行数</returns>publicstaticintExecteNonQueryText(stringcmdText,SqlParameter[]commandParameters){returnExecteNonQuery(CommandType.Text,cmdText,commandParameters);}#endregion#region//GetTable方法///<summary>///执行一条返回结果集的SqlCommand,通过一个已经存在的数据库连接///使用参数数组提供参数///</summary>///<paramname="connecttionString">一个现有的数据库连接</param>///<paramname="cmdTye">SqlCommand命令类型</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个表集合(DataTableCollection)表示查询得到的数据集</returns>publicstaticDataTableCollectionGetTable(stringconnecttionString,CommandTypecmdTye,stringcmdText,SqlParameter[]commandParameters){SqlCommandcmd=newSqlCommand();DataSetds=newDataSet();using(SqlConnectionconn=newSqlConnection(connecttionString)){PrepareCommand(cmd,conn,null,cmdTye,cmdText,commandParameters);SqlDataAdapteradapter=newSqlDataAdapter();adapter.SelectCommand=cmd;adapter.Fill(ds);}DataTableCollectiontable=ds.Tables;returntable;}///<summary>///执行一条返回结果集的SqlCommand,通过一个已经存在的数据库连接///使用参数数组提供参数///</summary>///<paramname="cmdTye">SqlCommand命令类型</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个表集合(DataTableCollection)表示查询得到的数据集</returns>publicstaticDataTableCollectionGetTable(CommandTypecmdTye,stringcmdText,SqlParameter[]commandParameters){returnGetTable(cmdTye,cmdText,commandParameters);}///<summary>///存储过程专用///</summary>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个表集合(DataTableCollection)表示查询得到的数据集</returns>publicstaticDataTableCollectionGetTableProducts(stringcmdText,SqlParameter[]commandParameters){returnGetTable(CommandType.StoredProcedure,cmdText,commandParameters);}///<summary>///Sql语句专用///</summary>///<paramname="cmdText">T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个表集合(DataTableCollection)表示查询得到的数据集</returns>publicstaticDataTableCollectionGetTableText(stringcmdText,SqlParameter[]commandParameters){returnGetTable(CommandType.Text,cmdText,commandParameters);}#endregion///<summary>///为执行命令准备参数///</summary>///<paramname="cmd">SqlCommand命令</param>///<paramname="conn">已经存在的数据库连接</param>///<paramname="trans">数据库事物处理</param>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">Commandtext,T-SQL语句例如Select*fromProducts</param>///<paramname="cmdParms">返回带参数的命令</param>privatestaticvoidPrepareCommand(SqlCommandcmd,SqlConnectionconn,SqlTransactiontrans,CommandTypecmdType,stringcmdText,SqlParameter[]cmdParms){//判断数据库连接状态if(conn.State!=ConnectionState.Open)conn.Open();cmd.Connection=conn;cmd.CommandText=cmdText;//判断是否需要事物处理if(trans!=null)cmd.Transaction=trans;cmd.CommandType=cmdType;if(cmdParms!=null){foreach(SqlParameterparmincmdParms)cmd.Parameters.Add(parm);}}///<summary>///ExecuteaSqlCommandthatreturnsaresultsetagainstthedatabasespecifiedintheconnectionstring///usingtheprovidedparameters.///</summary>///<paramname="connectionString">一个有效的数据库连接字符串</param>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>ASqlDataReadercontainingtheresults</returns>publicstaticSqlDataReaderExecuteReader(stringconnectionString,CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){SqlCommandcmd=newSqlCommand();SqlConnectionconn=newSqlConnection(connectionString);//weuseatry/catchherebecauseifthemethodthrowsanexceptionwewantto//closetheconnectionthrowcode,becausenodatareaderwillexist,hencethe//commandBehaviour.CloseConnectionwillnotworktry{PrepareCommand(cmd,conn,null,cmdType,cmdText,commandParameters);SqlDataReaderrdr=cmd.ExecuteReader(CommandBehavior.CloseConnection);cmd.Parameters.Clear();returnrdr;}catch{conn.Close();throw;}}#region//ExecuteDataSet方法///<summary>///returnadataset///</summary>///<paramname="connectionString">一个有效的数据库连接字符串</param>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>returnadataset</returns>publicstaticDataSetExecuteDataSet(stringconnectionString,CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){SqlConnectionconn=newSqlConnection(connectionString);SqlCommandcmd=newSqlCommand();try{PrepareCommand(cmd,conn,null,cmdType,cmdText,commandParameters);SqlDataAdapterda=newSqlDataAdapter();DataSetds=newDataSet();da.SelectCommand=cmd;da.Fill(ds);returnds;}catch{conn.Close();throw;}}///<summary>///返回一个DataSet///</summary>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>returnadataset</returns>publicstaticDataSetExecuteDataSet(CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){returnExecuteDataSet(connectionString,cmdType,cmdText,commandParameters);}///<summary>///返回一个DataSet///</summary>///<paramname="cmdText">存储过程的名字</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>returnadataset</returns>publicstaticDataSetExecuteDataSetProducts(stringcmdText,SqlParameter[]commandParameters){returnExecuteDataSet(connectionString,CommandType.StoredProcedure,cmdText,commandParameters);}///<summary>///返回一个DataSet///</summary>///<paramname="cmdText">T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>returnadataset</returns>publicstaticDataSetExecuteDataSetText(stringcmdText,SqlParameter[]commandParameters){returnExecuteDataSet(connectionString,CommandType.Text,cmdText,commandParameters);}publicstaticDataViewExecuteDataSet(stringconnectionString,stringsortExpression,stringdirection,CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){SqlConnectionconn=newSqlConnection(connectionString);SqlCommandcmd=newSqlCommand();try{PrepareCommand(cmd,conn,null,cmdType,cmdText,commandParameters);SqlDataAdapterda=newSqlDataAdapter();DataSetds=newDataSet();da.SelectCommand=cmd;da.Fill(ds);DataViewdv=ds.Tables[0].DefaultView;dv.Sort=sortExpression+""+direction;returndv;}catch{conn.Close();throw;}}#endregion#region//ExecuteScalar方法///<summary>///返回第一行的第一列///</summary>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个对象</returns>publicstaticobjectExecuteScalar(CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){returnExecuteScalar(SqlHelper.connectionString,cmdType,cmdText,commandParameters);}///<summary>///返回第一行的第一列存储过程专用///</summary>///<paramname="cmdText">存储过程的名字</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个对象</returns>publicstaticobjectExecuteScalarProducts(stringcmdText,SqlParameter[]commandParameters){returnExecuteScalar(SqlHelper.connectionString,CommandType.StoredProcedure,cmdText,commandParameters);}///<summary>///返回第一行的第一列Sql语句专用///</summary>///<paramname="cmdText">者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>返回一个对象</returns>publicstaticobjectExecuteScalarText(stringcmdText,SqlParameter[]commandParameters){returnExecuteScalar(SqlHelper.connectionString,CommandType.Text,cmdText,commandParameters);}///<summary>///ExecuteaSqlCommandthatreturnsthefirstcolumnofthefirstrecordagainstthedatabasespecifiedintheconnectionstring///usingtheprovidedparameters.///</summary>///<remarks>///e.g.:///Objectobj=ExecuteScalar(connString,CommandType.StoredProcedure,"PublishOrders",newSqlParameter("@prodid",24));///</remarks>///<paramname="connectionString">一个有效的数据库连接字符串</param>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>AnobjectthatshouldbeconvertedtotheexpectedtypeusingConvert.To{Type}</returns>publicstaticobjectExecuteScalar(stringconnectionString,CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){SqlCommandcmd=newSqlCommand();using(SqlConnectionconnection=newSqlConnection(connectionString)){PrepareCommand(cmd,connection,null,cmdType,cmdText,commandParameters);objectval=cmd.ExecuteScalar();cmd.Parameters.Clear();returnval;}}///<summary>///ExecuteaSqlCommandthatreturnsthefirstcolumnofthefirstrecordagainstanexistingdatabaseconnection///usingtheprovidedparameters.///</summary>///<remarks>///e.g.:///Objectobj=ExecuteScalar(connString,CommandType.StoredProcedure,"PublishOrders",newSqlParameter("@prodid",24));///</remarks>///<paramname="connectionString">一个有效的数据库连接字符串</param>///<paramname="cmdType">SqlCommand命令类型(存储过程,T-SQL语句,等等。)</param>///<paramname="cmdText">存储过程的名字或者T-SQL语句</param>///<paramname="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>///<returns>AnobjectthatshouldbeconvertedtotheexpectedtypeusingConvert.To{Type}</returns>publicstaticobjectExecuteScalar(SqlConnectionconnection,CommandTypecmdType,stringcmdText,SqlParameter[]commandParameters){SqlCommandcmd=newSqlCommand();PrepareCommand(cmd,connection,null,cmdType,cmdText,commandParameters);objectval=cmd.ExecuteScalar();cmd.Parameters.Clear();returnval;}#endregion///<summary>///addparameterarraytothecache///</summary>///<paramname="cacheKey">Keytotheparametercache</param>///<paramname="cmdParms">anarrayofSqlParamterstobecached</param>publicstaticvoidCacheParameters(stringcacheKey,SqlParameter[]commandParameters){parmCache[cacheKey]=commandParameters;}///<summary>///Retrievecachedparameters///</summary>///<paramname="cacheKey">keyusedtolookupparameters</param>///<returns>CachedSqlParamtersarray</returns>publicstaticSqlParameter[]GetCachedParameters(stringcacheKey){SqlParameter[]cachedParms=(SqlParameter[])parmCache[cacheKey];if(cachedParms==null)returnnull;SqlParameter[]clonedParms=newSqlParameter[cachedParms.Length];for(inti=0,j=cachedParms.Length;i<j;i++)clonedParms[i]=(SqlParameter)((ICloneable)cachedParms[i]).Clone();returnclonedParms;}///<summary>///检查是否存在///</summary>///<paramname="strSql">Sql语句</param>///<returns>bool结果</returns>publicstaticboolExists(stringstrSql){intcmdresult=Convert.ToInt32(ExecuteScalar(connectionString,CommandType.Text,strSql,null));if(cmdresult==0){returnfalse;}else{returntrue;}}///<summary>///检查是否存在///</summary>///<paramname="strSql">Sql语句</param>///<paramname="cmdParms">参数</param>///<returns>bool结果</returns>publicstaticboolExists(stringstrSql,SqlParameter[]cmdParms){intcmdresult=Convert.ToInt32(ExecuteScalar(connectionString,CommandType.Text,strSql,cmdParms));if(cmdresult==0){returnfalse;}else{returntrue;}}}}
本篇博客只涉及到添加数据 (insert into) 并陆续的更新其他SQL操作, 本人希望封装一个全套基本的SQL操作。在以后如果从事后端可以在此扩展 , 不喜勿喷。
本人希望用SqlParameter的方式来构建T-SQL
一 : 构建基本的T-SQL( 没有SqlParameter参数注入 )
usingDBDome.model;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Reflection;usingSystem.Text;namespaceDBDome.com{///<summary>///SQL构建器(还没与赋值)///</summary>publicsealedclassSQL_Structure{privateSQL_Structure(){}///<summary>///添加一个数据的T-SQL的构成///</summary>///<typeparamname="T"></typeparam>///<paramname="model"></param>///<returns></returns>publicstaticstringADD_T_SQL<T>(Tmodel)whereT:BaseModel{stringbase_add=@"insertinto[{0}]({1})values({2})";//表名,列明,对应的值Typemodel_type=model.GetType();string[]arr=model_type.Name.Split(newchar[]{'.'});stringtable_name=arr[arr.Length-1];//获得表的名称PropertyInfo[]p_intos=model_type.GetProperties();StringBuildertable_field_name=newStringBuilder();StringBuildertable_field_value=newStringBuilder();PropertyInfoitem=null;for(inti=0;i<p_intos.Length;i++){item=p_intos[i];if(item.Name!="id")//不应添加主键{table_field_name.Append(item.Name+",");table_field_value.Append("@"+item.Name+",");}}returnString.Format(base_add,table_name,table_field_name.ToString().Substring(0,table_field_name.ToString().Length-1),table_field_value.ToString().Substring(0,table_field_value.ToString().Length-1));}}}
二 : 好了我现在构造与SQL表映射的模型类
①,所有model的基类:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceDBDome.model{publicabstractclassBaseModel{protectedint_id;///<summary>///主键ID号///</summary>publicvirtualintid{get{returnthis._id;}set{this._id=value;}}}}
② , 继承model的一个类User也是我的一个SQL表名
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceDBDome.model{publicsealedclassUser:BaseModel{publicstringname{get;set;}publicshortsex{get;set;}publicintlv{get;set;}publicstringusername{get;set;}publicstringuserpwd{get;set;}}}
三 , 我们添加一条数据, 需要构建参数 SqlParameter[]
usingDBDome.model;usingSystem;usingSystem.Collections.Generic;usingSystem.Data.SqlClient;usingSystem.Linq;usingSystem.Reflection;usingSystem.Text;usingSystem.Data;namespaceDBDome.com{///<summary>///SqlParameter构建///</summary>publicsealedclassSqlParameter_Structure{privateSqlParameter_Structure(){}///<summary>///构建T-SQL参数ADD///</summary>///<typeparamname="T"></typeparam>///<paramname="model"></param>///<returns></returns>publicstaticSqlParameter[]ADD_T_SQL<T>(Tmodel)whereT:BaseModel{Typemodel_type=model.GetType();PropertyInfo[]p_intos=model_type.GetProperties();SqlParameter[]sql_param=newSqlParameter[p_intos.Length-1];//不需要主键PropertyInfoitem=null;stringp_name="";SqlParametercell=null;intj=0;for(inti=0;i<p_intos.Length;i++){item=p_intos[i];p_name=item.Name;if(p_name=="id")continue;//Console.WriteLine("字段{0}的类型为{1}",p_name,item.PropertyType);cell=newSqlParameter(p_name,SqlParameter_Structure.Get_SqlDbType_SqlType(item.PropertyType));cell.Value=item.GetValue(model,null);sql_param[j]=cell;j++;}returnsql_param;}privatestaticSqlDbTypeGet_SqlDbType_SqlType(Typecshaper){string[]arr=cshaper.ToString().Split(newchar[]{'.'});stringtoLow=arr[arr.Length-1].ToLower();switch(toLow){case"string":returnSqlDbType.NVarChar;break;case"int16":returnSqlDbType.Bit;break;case"int32":returnSqlDbType.Int;break;default:thrownewException(String.Format("T-SQL参数没有配对的类型{0}",cshaper));break;}}}}
感谢各位的阅读!关于“C#如何实现SQL封装”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。