调用分页的存储过程 返回0行数据

yadoufeng 2011-03-07 04:40:27

create procedure DivPage
@strSql varchar(800),
@nPageSize int,
@nPageCount int
as
SET NOCOUNT ON
DECLARE @P1 INT,
@nRowCount INT

--//注意 :@scrollopt = 1 会取得Select 的时候的总行数
EXEC sp_cursoropen @P1 OUTPUT, @strSql, @scrollopt = 2, @ccopt = 335873, @rowcount = @nRowCount OUTPUT

IF (@P1 != 0)
BEGIN
--Select @nRowCount AS nRecordCount, ceiling(1.0 * @nRowCount / @nPageSize) AS nPageCount, @nPageCount AS nPage
SET @nPageCount = (@nPageCount - 1) * @nPageSize + 1
EXEC sp_cursorfetch @P1, 32, @nPageCount, @nPageSize
EXEC sp_cursorclose @P1
END
GO



using(comm.Connection =new SqlConnection(DBCommon.constr) )
{
string query = "select * from person";
comm.Connection.Open();
comm.CommandText = "DivPage";
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@strsql", query));
comm.Parameters.Add(new SqlParameter("@nPageSize",10));
comm.Parameters.Add(new SqlParameter("@nPageCount",1));
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = comm;
da.Fill(dt); //结果dt为空没有结果 在数据库直接执行 exec DivPage 'select * from person',10,1 能出结果


...全文
124 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
流光 2013-08-14
  • 打赏
  • 举报
回复
执行了EXEC sp_cursoropen,就会返回一个数据集,
并且这个数据集会是空的,楼主的Tables[0],就是这个空数据集了。
chen_ya_ping 2011-03-08
  • 打赏
  • 举报
回复
dt = ds.Tables[0];
是0吧,不是1
我觉得,你应该在数据库中测试存储过程对不对,然后再调试你的程序。
yadoufeng 2011-03-08
  • 打赏
  • 举报
回复


DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = sqlCmd;
da.Fill(ds);
sqlCmd.Connection.Close();
dt = ds.Tables[1];
这样就有数据了 不知道 他为什么不在ds.Tables[0];
这样必须借助 DataSet


dt.Load(sqlCmd.ExecuteReader());
sqlCmd.Connection.Close(); 这样直接来就没数据了
yadoufeng 2011-03-08
  • 打赏
  • 举报
回复
我 发现

DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = sqlCmd;
da.Fill(ds);
sqlCmd.Connection.Close();

dt = ds.Tables[1]; //dt = ds.Tables[0]; 就没值

ds.Tables[1]有值; ds.Tables[0]没值; 那 ds.Tables[0]干嘛去了呢
子夜__ 2011-03-08
  • 打赏
  • 举报
回复
用这个方法来调用

/// <summary>
/// 执行有参的查询 返回DataTable
/// </summary>
/// <param name="cmdtext">存储过程名称或SQL语句</param>
/// <param name="ct">命令类型</param>
/// <param name="para">参数数组</param>
/// <returns>返回DataTable</returns>
public static DataTable ReturnDataTable(string cmdtext, CommandType ct, SqlParameter[] para)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdtext, GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(para);
SqlDataReader dr = null;
using (dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(dr);
}
return dt;
}


给你个调用的demo

  public int TeacherApp_add(M_Model.Parameters parameter)
{
IDataParameter[] iData = new SqlParameter[5];
iData[0] = new SqlParameter("@TableName", "S_Appraisalnote");
iData[1] = new SqlParameter("@sqlcolumns", parameter.Sqlcolumns);
iData[2] = new SqlParameter("@sqlstrpara", parameter.NewSqlstrpara);
iData[3] = new SqlParameter("@S_id", parameter.S_id);
iData[4] = new SqlParameter("@C_id", parameter.ClassID);
DataComponent dac = new DataComponent();
int value = dac.ExecuteNonQuery("Proc_InsertS_Appraisalnote",CommandType.StoredProcedure,iData);
dac.Close();
return value;
}
自然框架 2011-03-07
  • 打赏
  • 举报
回复
sp_cursorfetch 这个还没用过,不过感觉效率不高。
yadoufeng 2011-03-07
  • 打赏
  • 举报
回复
不是啊 现在有问题 总得解决吧 不知道错在哪里 他没有报错 就是取不到数据 在 sql查询分析器里 能出结果
自然框架 2011-03-07
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110130/08/9aa19fd5-96ea-4101-be22-2ee22bb2bf53.html

分页也是可以不用存储过程的,效率也高。
yadoufeng 2011-03-07
  • 打赏
  • 举报
回复
还是 没有 取到值啊 也不报错
Rock870210 2011-03-07
  • 打赏
  • 举报
回复
/// <summary>
/// 获取DataSet对象
/// </summary>
/// <param name="queryString">T-SQL语句</param>
/// <param name="commandType">命令类型</param>
/// <param name="param">T-SQL参数</param>
/// <returns>DataSet对象</returns>
public static DataSet GetDataSet(string queryString, CommandType commandType, params SqlParameter[] param)
{
DataSet ds = new DataSet();
using (SqlConnection con = new SqlConnection(ConnectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter(queryString, con);
adapter.SelectCommand.CommandType = commandType;

if (param != null)
{
for (int i = 0; i < param.Length; i++)
{
adapter.SelectCommand.Parameters.Add(param[i]);
}
}

try
{
adapter.Fill(ds);
}
catch (Exception ex)
{
throw ex;
}
finally
{
adapter.Dispose();
adapter = null;
}
}
return ds;
}
用这个试试

62,253

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧