SqlHelper详细讲解

来源:互联网 发布:重庆网络问政平台官网 编辑:程序博客网 时间:2024/05/29 19:54
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;


namespace Itcast.Cn
{
    public static class SqlHelper
    {
        private static readonly string conStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;




        //执行增删改的
        public static int ExecuteNonQuery(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    cmd.CommandType = cmdType;
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return cmd.ExecuteNonQuery();
                }
            }
        }


        //封装一个执行返回单个值的方法
        public static object ExecuteScalar(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    cmd.CommandType = cmdType;
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    con.Open();
                    return cmd.ExecuteScalar();
                }
            }
        }


        //返回SqlDataReader对象的方法


        public static SqlDataReader ExecuteReader(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            SqlConnection con = new SqlConnection(conStr);
            using (SqlCommand cmd = new SqlCommand(sql, con))
            {
                cmd.CommandType = cmdType;
                if (pms != null)
                {
                    cmd.Parameters.AddRange(pms);
                }
                try
                {
                    con.Open();
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception)
                {
                    con.Close();
                    con.Dispose();
                    throw;
                }
            }
        }




        //封装一个返回DataTable的方法
        public static DataTable ExecuteDataTable(string sql, CommandType cmdType, params SqlParameter[] pms)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conStr))
            {
                adapter.SelectCommand.CommandType = cmdType;
                if (pms != null)
                {
                    adapter.SelectCommand.Parameters.AddRange(pms);
                }
                adapter.Fill(dt);
            }


            return dt;
        }


        //封装一个带事务的执行Sql语句的方法
        public static void ExecuteNonQueryTran(List<SqlAndParameter> list)
        {
            using (SqlConnection con = new SqlConnection(conStr))
            {
                using (SqlCommand cmd = con.CreateCommand())
                {
                    con.Open();
                    using (SqlTransaction trans = con.BeginTransaction())
                    {
                        cmd.Transaction = trans;
                        try
                        {
                            foreach (var SqlObject in list)
                            {
                                cmd.CommandText = SqlObject.Sql;
                                if (SqlObject.Parameters != null)
                                {
                                    cmd.Parameters.AddRange(SqlObject.Parameters);
                                }
                                cmd.CommandType = SqlObject.CmdType;
                                cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        catch (Exception)
                        {
                            trans.Rollback();
                            throw;
                        }
                    }
                }
            }
        }
    }


    public class SqlAndParameter
    {
        public string Sql
        {
            get;
            set;
        }


        public SqlParameter[] Parameters
        {
            get;
            set;
        }


        public CommandType CmdType
        {
            get;
            set;
        }
    }

}


CommandType 枚举。用来枚举所有的命令类型,默认是 CommandType.Text,用于执行SQL语句。如果我们把SqlCommand 的 CommandText 设置为一个存储过程名,则应该指字 CommandType 为 CommandType.StoredProcedure。


摘自msdn:


CommandType 属性设置为 TableDirect 时,应将 CommandText 属性设置为要访问的表的名称。 如果已命名的任何表包含任何特殊字符,那么用户可能需要使用转义符语法或包括限定字符。当您调用“执行”(Execute) 方法之一时,将返回命名表的所有行和列。


为了访问多个表,请使用逗号分隔的列表(没有空格或空白),其中包含要访问的多个表的名称。当 CommandText 属性命名多个表时,返回指定表的联接。
只有用于 OLE DB 的 .NET Framework 数据提供程序才支持 TableDirect。 当 CommandType 设置为 TableDirect 时,不支持对多个表的访问。 




ExecuteNonQuery 
针对 Connection 执行 SQL 语句并返回受影响的行数。 返回值 
受影响的行数。 
备注 
您可以使用 ExecuteNonQuery 来执行目录操作(例如查询数据库的结构或创建诸如表等的数据库对象),或通过执行 UPDATE、INSERT 或 DELETE 语句,在不使用 DataSet 的情况下更改数据库中的数据。 
虽然 ExecuteNonQuery 不返回任何行,但映射到参数的任何输出参数或返回值都会用数据进行填充。 
对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。


ExecuteScalar 
执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。 
  
返回值 
  
结果集中第一行的第一列或空引用(如果结果集为空)。
使用 ExecuteScalar 方法从数据源中检索单个值(例如一个聚合值)。与使用 ExecuteReader 方法,然后使用OleDbDataReader 返回的数据执行生成单个值所需的操作相比,此操作需要的代码较少。






CommandBehavior 枚举




由 .NET Compact Framework 支持 CloseConnection在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。 
由 .NET Compact Framework 支持 Default此查询可能返回多个结果集。执行查询可能会影响数据库状态。Default 不设置 CommandBehavior 标志,因此调用 ExecuteReader(CommandBehavior.Default) 在功能上等效于调用 ExecuteReader()。 
由 .NET Compact Framework 支持 KeyInfo此查询返回列和主键信息。  


当 KeyInfo 用于命令执行时,提供程序将为现有主键列和时间戳列的结果集附加额外的列。


当使用 KeyInfo 时,用于 SQL Server 的 .NET Framework 数据提供程序将在要执行的语句前加上 SET FMTONLY OFF 和 SET NO_BROWSETABLE ON。用户应该注意潜在的副作用,例如对 SET FMTONLY ON 语句的使用产生的干扰。有关更多信息,请参见“SQL Server 联机丛书”。
由 .NET Compact Framework 支持 SchemaOnly查询仅返回列信息。当使用 SchemaOnly 时,用于 SQL Server 的 .NET Framework 数据提供程序将在要执行的语句前加上 SET FMTONLY ON。 
由 .NET Compact Framework 支持 SequentialAccess提供一种方法,以便 DataReader 处理包含带有大二进制值的列的行。SequentialAccess 不是加载整行,而是使 DataReader 将数据作为流来加载。然后可以使用 GetBytes 或 GetChars 方法来指定开始读取操作的字节位置以及正在返回的数据的有限的缓冲区大小。 


当指定 SequentialAccess 时,尽管无需读取每个列,但是需要按照列的返回顺序读取它们。一旦已经读过返回的数据流中某个位置的内容,就不能再从 DataReader 中读取该位置或该位置之前的数据。当使用 OleDbDataReader 时,可重新读取当前列的值,直到读过它。当使用 SqlDataReader 时,一次只能读取一个列值。
由 .NET Compact Framework 支持 SingleResult查询返回一个结果集。 
由 .NET Compact Framework 支持 SingleRow查询应返回一行。执行查询可能会影响数据库的状态。一些 .NET Framework 数据提供程序可能(但不要求)使用此信息来优化命令的性能。用 OleDbCommand 对象的 ExecuteReader 方法指定 SingleRow 时,用于 OLE DB 的 .NET Framework 数据提供程序使用 OLE DB IRow 接口(如果可用)执行绑定。否则,它使用 IRowset 接口。如果您的 SQL 语句应该只返回一行,则指定 SingleRow 还可以提高应用程序性能。在执行返回多个结果集的查询时,可以指定 SingleRow。在这种情况下,仍返回多个结果集,但每个结果集只有一行。 



0 0