【问题标题】:ObjectDataSource stored procedure parameter is from a method?ObjectDataSource 存储过程参数是否来自方法?
【发布时间】:2013-07-01 06:20:02
【问题描述】:

我正在尝试在 asp.net web-forms 应用程序中使用 GridView 设置 ObjectDataSource。我计划用于 ObjectDataSource 的 select 命令通过使用存储过程查询数据库来返回 DataTable,如下所示:

public DataTable GetProductsById(string ids = null)
        {

            DataTable productDataTable = new DataTable();

            // Stored procedure (sqldb server) is executed here
            SqlCommand cmd = new SqlCommand("GetProductByIdsRML_CLR", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter myParam = new SqlParameter("@ids", SqlDbType.NVarChar);
            myParam.Value = (ids);
            cmd.Parameters.Add(myParam);
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            dataAdapter.SelectCommand = cmd;

            dataAdapter.Fill(productDataTable);

            return productDataTable;
        }

该方法将字符串作为参数,该字符串是以逗号分隔的产品 ID 列表,此参数被传递给存储过程,然后执行查询。但是,我无法正确设置它,因为此输入 ids 是通过代码中的另一个方法传递给此方法的。这就是问题所在,因为在尝试设置 ObjectDataSource 时,它​​会询问存储过程的参数应该来自哪里,但“另一种方法”不是一个选项。这就是我所说的:

这些选项似乎都没有封装“此项目中的另一种方法”。如果有人知道在这种情况下该怎么做,那就太好了。此外,如果从存储过程返回 DataTable 不是一个好主意,那也没关系,我可以很容易地改变它,但问题仍然存在。谢谢!我觉得有一个非常简单的解决方案......

【问题讨论】:

    标签: c# asp.net gridview webforms datasource


    【解决方案1】:

    感谢 msdn 上的这个教程,我解决了这个问题:

    http://msdn.microsoft.com/en-us/library/aa581787.aspx

    在文章的最后,它展示了如何在代码中实现我想要做的事情。您从该下拉列表中选择“无”并将参数放在 ObjectDataSource 的 Selecting 事件后面的代码中,我的看起来像这样:

    protected void ObjectDataSource1_Selecting(object sender,
                                               ObjectDataSourceSelectingEventArgs e)
            {
                e.InputParameters["ids"] = SearchResults.idList;
            }
    

    idList 是我需要传递给存储过程的以逗号分隔的字符串列表。只要每次都定义了 idList 字段,GridView + ObjectDataSource 几乎可以处理其余部分。

    【讨论】:

      【解决方案2】:

      一种选择是使用Session,然后使用PageOnLoadComplete 方法并在其中设置Session 变量。

      protected override void OnLoadComplete(EventArgs e)
      {
          ...
      }
      

      【讨论】:

      • 感谢您的快速回复。我想过做这样的事情(将它存储在Session),但我认为这可能不是最好的主意,因为这个参数将是一个几千个字符长的字符串,会话似乎不是最好的地方对于这样的事情......
      • @akowalz,如果您愿意,可以使用Cookie,但我不会说可以轻松清理的几千字节数据可能是一个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2017-06-04
      • 2017-03-14
      • 1970-01-01
      • 2012-10-23
      相关资源
      最近更新 更多