一、分页
方法一:
/// <summary>
/// 获得分页后的数据列表
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="strWhere">筛选条件</param>
/// <param name="strOrder">排序条件</param>
/// <param name="startIndex">开始的索引</param>
/// <param name="endIndex">结束的索引</param>
/// <returns></returns>
public DataSet GetListByPaged(string tableName, string strWhere, string strOrder, int startIndex, int endIndex)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("SELECT * FROM ( ");
strSql.Append(" SELECT ROW_NUMBER() OVER (");
if (!string.IsNullOrEmpty(strOrder.Trim()))
{
strSql.Append("order by T." + strOrder);
}
strSql.Append(")AS num, T.* from " + tableName + " T ");
if (!string.IsNullOrEmpty(strWhere.Trim()))
{
strSql.Append(" WHERE " + strWhere);
}
strSql.Append(" ) TT");
strSql.AppendFormat(" WHERE TT.num between {0} and {1}", startIndex, endIndex);
return DbManagerSQL.Query(strSql.ToString());
}
方法二:
/// <summary>
/// 分页方法
/// Created by roc,2009/07/11
/// </summary>
/// <param name="Tables">表名,多表联合查询请使用 tA a inner join tB b On a.AID = b.AID</param>
/// <param name="PK">主键,可以带表头 a.AID</param>
/// <param name="Sort">排序字段</param>
/// <param name="PageNumber">开始页码</param>
/// <param name="PageSize">页大小</param>
/// <param name="Fields">读取字段</param>
/// <param name="Filter">Where条件</param>
/// <param name="Group">分组</param>
/// <param name="IsCount">是否获得总记录数,0表示不获得记录总数,1表示获得分页数据的同时获得记录总数,2表示仅获得记录总数</param>
/// <returns>分页结果集</returns>
public static DataSet GetRecordByPage_1_0(string Tables, string PK, string Sort, int PageNumber, int PageSize, string Fields, string Filter, string Group, int IsCount)
{
//获得命令
//string sqlCommand = "Pg_Paging";
//DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
SqlParameter[] parameters = {
new SqlParameter("@Tables", SqlDbType.VarChar, 1000),
new SqlParameter("@PK", SqlDbType.VarChar, 100),
new SqlParameter("@Sort", SqlDbType.VarChar,100),
new SqlParameter("@PageNumber",SqlDbType.Int),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@Fields", SqlDbType.VarChar,1000),
new SqlParameter("@Filter", SqlDbType.VarChar,1000),
new SqlParameter("@Group", SqlDbType.VarChar,1000),
new SqlParameter("@isCount", SqlDbType.Int)
};
parameters[0].Value = Tables;
parameters[1].Value = PK;
parameters[2].Value = Sort;
parameters[3].Value = PageNumber;
parameters[4].Value = PageSize;
parameters[5].Value = Fields;
parameters[6].Value = Filter;
parameters[7].Value = Group;
parameters[8].Value = IsCount;
return RunProcedure("P_GetRecordByPage_1_0", parameters, "ds");
}
#region 存储过程操作
public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters)
{
SqlConnection connection = new SqlConnection(connectionString);
try
{
DataSet dataSet = new DataSet();
connection.Open();
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);
sqlDA.Fill(dataSet, "DataTable");
connection.Close();
return dataSet;
}
finally
{
connection.Dispose();
}
}
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <param name="tableName">DataSet结果中的表名</param>
/// <returns>DataSet</returns>
public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName )
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet dataSet = new DataSet();
connection.Open();
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters );
sqlDA.Fill( dataSet, tableName );
connection.Close();
return dataSet;
}
}
/// <summary>
/// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
/// </summary>
/// <param name="connection">数据库连接</param>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>SqlCommand</returns>
private static SqlCommand BuildQueryCommand(SqlConnection connection,string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = new SqlCommand( storedProcName, connection );
command.CommandType = CommandType.StoredProcedure;
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add( parameter );
}
return command;
}
/// <summary>
/// 执行存储过程,返回影响的行数
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <param name="rowsAffected">影响的行数</param>
/// <returns></returns>
public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected )
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
int result;
connection.Open();
SqlCommand command = BuildIntCommand(connection,storedProcName, parameters );
rowsAffected = command.ExecuteNonQuery();
result = (int)command.Parameters["ReturnValue"].Value;
return result;
}
}
/// <summary>
/// CDW 扩展可以用外面的数据库对串联接
/// </summary>
/// <param name="storedProcName">存储过程名称</param>
/// <param name="parameters">存储过程参数</param>
/// <param name="command">SQLCommon对像</param>
/// <param name="rowsAffected">返回影响数据条数</param>
/// <returns>返回值</returns>
public static int RunProcedure(string storedProcName, IDataParameter[] parameters,SqlCommand command, out int rowsAffected)
{
int result;
if (command.Connection != null && command.Connection.State == ConnectionState.Closed)
command.Connection.Open();
CommandType oldcommandtype = command.CommandType;
if (oldcommandtype != CommandType.StoredProcedure)
command.CommandType = CommandType.StoredProcedure;
command.CommandText = storedProcName;
command.Parameters.Add(new SqlParameter("ReturnValue",
SqlDbType.Int, 4, ParameterDirection.ReturnValue,
false, 0, 0, string.Empty, DataRowVersion.Default, null));
foreach (SqlParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
rowsAffected = command.ExecuteNonQuery();
result = (int)command.Parameters["ReturnValue"].Value;
if (oldcommandtype != CommandType.StoredProcedure)
command.CommandType = oldcommandtype;
return result;
}
public static string RunProcedureScalar(string storedProcName, IDataParameter[] parameters, string retName)
{
SqlConnection connection = new SqlConnection(connectionString);
try
{
connection.Open();
SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
command.ExecuteNonQuery();
return System.Convert.ToString(command.Parameters[retName].Value);
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
connection.Dispose();
}
}
/// <summary>
/// 创建 SqlCommand 对象实例(用来返回一个整数值)
/// </summary>
/// <param name="storedProcName">存储过程名</param>
/// <param name="parameters">存储过程参数</param>
/// <returns>SqlCommand 对象实例</returns>
private static SqlCommand BuildIntCommand(SqlConnection connection,string storedProcName, IDataParameter[] parameters)
{
SqlCommand command = BuildQueryCommand(connection,storedProcName, parameters );
command.Parameters.Add( new SqlParameter ( "ReturnValue",
SqlDbType.Int,4,ParameterDirection.ReturnValue,
false,0,0,string.Empty,DataRowVersion.Default,null ));
return command;
}
#endregion
存储过程:
create PROCEDURE [dbo].[P_GetRecordByPage_1_0]
@Tables varchar(3000), --表名,多表联合查询请使用 tA a inner join tB b On a.AID = b.AID
@PK varchar(100), --主键,可以带表头 a.AID
@Sort varchar(100) = '', --排序字段
@PageNumber int = 1, --开始页码
@PageSize int = 20, --页大小
@Fields varchar(3000) = '*',--读取字段
@Filter varchar(1000) = NULL,--Where条件
@Group varchar(1000) = NULL,--分组
@IsCount int = 0 --是否获得总记录数,0表示不获得记录总数,1表示获得分页数据的同时获得记录总数,2表示仅获得记录总数
AS
declare @strFilter varchar(2000)
declare @sql varchar(8000)
declare @strTotal varchar(6000)
declare @grpCountSql varchar(6000) /*存在分组数据统计总数时的sql处理*/
set @grpCountSql = ''
IF((@Filter IS NOT NULL) AND (@Filter != ''))
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
END
ELSE
BEGIN
SET @strFilter = ''
END
if(@IsCount != 2)
begin
if @Sort = ''
begin
set @Sort = @PK-- + ' DESC '
end
IF @PageNumber < 1
begin
SET @PageNumber = 1
end
-- if @PageNumber = 1 --第一页提高性能
-- begin
-- top 跟 BETWEEN 取出来的数据有可能不一样,导致CWT\行旅 UATP客户设置展示不全
-- set @sql = 'select top ' + str(@PageSize) +' '+@Fields+ ' from ' + @Tables + ' ' + @strFilter + @Group + ' ORDER BY '+ @Sort
-- -- print @sql
---- print 'assss'
---- return
-- end
-- else
-- begin
/**//*Execute dynamic query*/
DECLARE @START_ID varchar(50)
DECLARE @END_ID varchar(50)
SET @START_ID = convert(varchar(50),(@PageNumber - 1) * @PageSize + 1)
SET @END_ID = convert(varchar(50),@PageNumber * @PageSize)
set @sql = ' SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum, '
+@Fields+ ' FROM '+@Tables+ @strFilter + @Group + ') AS D where rownum BETWEEN '+@START_ID
+' AND ' +@END_ID
exec(@sql)
end
/*分组时的记录总数*/
set @grpCountSql = 'select count(*) from (' + 'select '+@Fields+ ' from ' + @Tables + ' ' + @strFilter + @Group + ') grpTb'
if((@IsCount = 1) or (@IsCount = 2)) --是否获得记录条数
begin
set @strTotal = 'SELECT Count(*) FROM ' + @Tables + @strFilter
if(len(@Group) > 0)
begin
set @strTotal = @grpCountSql
end
exec(@strTotal)
end