set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER  Procedure [dbo].[PagingRecord] 
 @TableName varchar(50),        --表名
 @Fields varchar(5000) = '*',    --字段名(全部字段为*)
 @OrderField varchar(5000),        --排序字段(必须!支持多字段)
 @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
 @pageSize int,                    --每页多少条记录
 @pageIndex int ,            --指定当前为第几页
 @TotalPage int OUT            --返回总页数 
as
--  declare @pageSize int
--  select @pageSize=40
begin
print '@PageSize='
print @PageSize
    Begin Tran --开始事务    Declare @sql nvarchar(4000);
    Declare @totalRecord int;        --计算总记录数
         
    if (@SqlWhere='' or @sqlWhere=NULL)
        set @sql = 'select @totalRecord = count(*) from ' + @TableName
    else
        set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数            --计算总页数
   
    if (@SqlWhere='' or @sqlWhere=NULL)
        set @sql = 'Select '+ @Fields +' FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
    else
        set @sql = 'Select '+ @Fields +' FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere        --处理页数超出范围情况
    if @PageIndex<=0
        Set @pageIndex = 1    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)    if @pageIndex>@TotalPage
        Set @pageIndex = @TotalPage     --处理开始点和结束点
    Declare @StartRecord int
    Declare @EndRecord int
    print @pageIndex
    set @StartRecord = (@pageIndex-1)*@PageSize + 1    set @EndRecord = @StartRecord + @pageSize - 1
    --继续合成sql语句
    set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
    print @Sql
    Exec(@Sql)
    ---------------------------------------------------
    If @@Error <> 0
       Begin
        RollBack Tran
        Return -1
       End
    Else
        Begin
            Commit Tran
             Return @totalRecord ---返回记录总数
        End    
end    
在程序里, 怎么将上面存储过程的值绑定到datagridview, 刚入门做项目, 还不太懂存储过程的用法. 期望各位指点指点.

解决方案 »

  1.   

    先讀取出來后,放到dataTable中,dataGridView再和dataTable綁定
    dataGridView.datasour=dataTable;
      

  2.   

    存储过程执行后,他是得到一个dataReader的值? 
      

  3.   

    那就一個個讀取出來,加到dataTable啊
      

  4.   

    用数据集
    using System.Data;
    using System.Data.Sql;
    using System.Data.SqlClient;
    .....//声明参数数组.....
     SqlParameter[] parms =
                    {   new SqlParameter("TableName",SqlDbType.VarChar,50),
                        new SqlParameter("Fields",SqlDbType.VarChar,5000),
                        new SqlParameter("OrderField",SqlDbType.VarChar,5000),
                        new SqlParameter("sqlWhere",SqlDbType.VarChar,5000),
                        new SqlParameter("pageSize",SqlDbType.Int),
                        new SqlParameter("pageIndex",SqlDbType.Int)
                    };
                
                SqlConnection conn = new SqlConnection("//连接字符串");
                SqlCommand cmd = new SqlCommand();            TranParms(cmd, conn, parms);
                
                DataSet ds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.Fill(ds);            GridView1.DataSource = ds;...
    //参数传入
    protected void TranParms(SqlCommand cmd, SqlConnection conn, SqlParameter parms)
            {
                cmd.CommandText = "PagingRecord";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                
                cmd.Parameters.Add(parms);        }
    ...
      

  5.   

     CommandType.StoredProcedure;
      

  6.   

    SqlParameterCollection 仅接受非空的 SqlParameter 类型对象,不接受 SqlParameter[] 对象。  报错了````
      

  7.   

           protected void TranParms(SqlCommand cmd, SqlConnection conn, SqlParameter[] parms)
            {
                cmd.CommandText = "PagingRecord";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                if (parms != null)
                {
                    foreach (SqlParameter parameter in parms)
                        cmd.Parameters.Add(parameter);
                };
            }
            private void dgv_databing()
            {
                #region
                SqlParameter[] parms =
                    {   new SqlParameter("tb_员工",SqlDbType.VarChar,50),
                        new SqlParameter("*",SqlDbType.VarChar,5000),
                        new SqlParameter("员工编号",SqlDbType.VarChar,5000),
                        new SqlParameter("Null",SqlDbType.VarChar,5000),
                        new SqlParameter("40",SqlDbType.Int),
                        new SqlParameter("1",SqlDbType.Int)
                    };
                SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ToString());
                SqlCommand cmd = new SqlCommand();
                TranParms(cmd, conn, parms);
                DataSet dgvds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.Fill(dgvds);
                dgv.DataSource = dgvds;            toolStripStatusLabel1.Text = "   公司员工共有[ " + dgv.RowCount.ToString() + " ]人 ";
    #endregion
            }        报错:在调用“Fill”前,SelectCommand 属性尚未初始化。  
      

  8.   

     private void dgv_databing()
            {
                #region
                SqlParameter[] parms =
                    {   new SqlParameter("tb_员工",SqlDbType.VarChar,50),
                        new SqlParameter("*",SqlDbType.VarChar,5000),
                        new SqlParameter("员工编号",SqlDbType.VarChar,5000),
                        new SqlParameter("Null",SqlDbType.VarChar,5000),
                        new SqlParameter("40",SqlDbType.Int),
                        new SqlParameter("1",SqlDbType.Int)
                    };            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ToString());
                SqlCommand cmd = dbclass.CreateCommand("PagingRecord", parms);
                DataSet dgvds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter("PagingRecord", conn);
                adapter.Fill(dgvds);
                dgv.DataSource = dgvds;            toolStripStatusLabel1.Text = "   公司员工共有[ " + dgv.RowCount.ToString() + " ]人 ";
    #endregion
            } public SqlCommand CreateCommand(string procName, SqlParameter[] prams)
            {
                #region
                // 确认打开连接
                Open();
                cmd = new SqlCommand(procName, sqlcn);
                cmd.CommandType = CommandType.StoredProcedure;            // 依次把参数传入存储过程
                if (prams != null)
                {
                    foreach (SqlParameter parameter in prams)
                        cmd.Parameters.Add(parameter);
                }            // 加入返回参数
                cmd.Parameters.Add(
                    new SqlParameter("ReturnValue", SqlDbType.Int, 4,
                    ParameterDirection.ReturnValue, false, 0, 0,
                    string.Empty, DataRowVersion.Default, null));            return cmd;
                #endregion
            } 错误提示: 过程或函数 'PagingRecord' 需要参数 '@TableName',但未提供该参数。
      

  9.   

    SqlDataAdapter adapter = new SqlDataAdapter();这句后面加上adapter.SelectCommand=cmd如果还报错的话那么原因可能是:你的这个CMD对象传入那个函数中之后,在函数里面虽然改变了它的值,但是你这里使用的是传值的方式,所以函数调用完之后这个CMD对象又是一个没有被改变的对象,所以在TranParms(cmd, conn, parms)这个函数的第一个参数应该改为TranParms(ref cmd, conn, parms),使它以传地址的方式传入函数中.还有一种方式就是把它定义为窗体级的变量,这样在函数中改变了值之后回到程序中这个对象的值也改变了!
      

  10.   

            protected void TranParms(ref SqlCommand cmd, SqlConnection conn, SqlParameter[] parms)
            {
                cmd.CommandText = "PagingRecord";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                if (parms != null)
                {
                    foreach (SqlParameter parameter in parms)
                        cmd.Parameters.Add(parameter);
                };
            } 
            private void dgv_databing()
            {
                #region
                SqlParameter[] parms =
                    {   new SqlParameter("tb_员工",SqlDbType.VarChar,50),
                        new SqlParameter("*",SqlDbType.VarChar,5000),
                        new SqlParameter("员工编号",SqlDbType.VarChar,5000),
                        new SqlParameter("Null",SqlDbType.VarChar,5000),
                        new SqlParameter("40",SqlDbType.Int),
                        new SqlParameter("1",SqlDbType.Int)
                    };
                
                SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ToString());
                SqlCommand cmd = new SqlCommand();
                TranParms(ref cmd, conn, parms); 
                DataSet dgvds = new DataSet();
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = cmd;
                adapter.Fill(dgvds);
                dgv.DataSource = dgvds;            toolStripStatusLabel1.Text = "   公司员工共有[ " + dgv.RowCount.ToString() + " ]人 ";
    #endregion
            }   还是报错过程或函数 'PagingRecord' 需要参数 '@TableName',但未提供该参数。
      

  11.   

    你的表名怎么是中文的
    new SqlParameter("tb_员工",SqlDbType.VarChar,50), 
    请使用nvarchar类型的,另外你可以在sp中加print来调试。
    我本来以为你提问分页的,说了一下在这里:
    http://www.cnprog.com/questions/23/C#FROM datagridview分页问题
      

  12.   

    没有把参数放进cmd里面啊,所以根本没有把参数传到存储过程中去。
      

  13.   

    不好意思,弄错了。是用cmd.Parameters.AddRange(SqlParameter)试试看啊。。呵呵