【问题标题】:Stored procedure connection wrapper存储过程连接包装器
【发布时间】:2012-11-20 15:07:26
【问题描述】:

我有一个用于查询 DB2 数据库的包装器。我设置包装器的方式是在查询方法中创建和处理连接。这样,我的包装器的消费者不必担心管理(打开和关闭)连接。有没有办法用存储过程做到这一点?我的一些用户发送出站参数,有没有办法将这些参数转换为数据表,就像我在上面的查询中所做的那样?

    /// <summary>
    /// Query A database and return a DataTable of strings with no null
    /// </summary>
    /// <param name="txtQuery">The Query</param>
    /// <param name="list">the paramaters for the query</param>
    /// <returns>Datatable with results</returns>
    public DataTable Query(string txtQuery, params string[] list)
    {
     //create return ovject
        DataTable dt = new DataTable();
        //pull dbconnection out of pool
        using (var conn = new DB2Connection(connectionstring))
        {
            //open connection
            if (!OpenConn(conn))
            {
                throw new Exception(“failed to connect”);
            }
            try
            {
                //query db
                using (DB2Command cmd = new DB2Command())
                {
                    cmd.Connection = conn;
                    cmd.CommandText = txtQuery;
                    for (int i = 0; i < list.Length; i++)
                    {
                        DB2Parameter param = new DB2Parameter(i.ToString(), list[i]);
                        cmd.Parameters.Add(param);
                    }
                    //fill datatable
                    using (DB2DataAdapter adap = new DB2DataAdapter())
                    {
                        adap.SelectCommand = cmd;
                        adap.Fill(dt);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }                
        }
       return dt;
    }

【问题讨论】:

  • 我不确定我是否理解了这个问题。您可以将CommandType 设置为StoredProcedure 并将其用于DataAdapter 以填充DataTable
  • 我的理解是,对于存储过程,您可以发送输出参数,然后使用需要原始打开连接的数据读取器读取这些参数
  • SP 返回什么?如果它是一个返回行的查询,您可以简单地使用适配器来填充 DataTable。
  • 从 Stored-Procedure 填充 DataTable 就这么简单:stackoverflow.com/a/13402124/284240
  • 顺便说一句,catch (Exception ex){throw ex;} 比没有更糟糕。只需删除该 try/catch 块。

标签: c# .net stored-procedures ado.net db2


【解决方案1】:

它不会那么容易做到,但它是可能的。我假设 DB2Parameter 与此答案中的 SqlParameter 基本相同...

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx 和相关页面将在我所说的之后(或期间)有用。

本质上,当调用带有输出参数的过程时,您可以像通常那样调用它。对于输出参数,您可以照常传入一个对象,但参数对象上有一个Direction 属性,可让您指定它是一个输出参数。

在过程中调用适当的执行方法后,这些输出参数的值将被填充并可以从参数对象中检索。

然后将它们放入 DataTable 由您决定。您可以创建一个数据表,为每个输出参数添加一列,然后添加一行包含所有值。

主要问题当然是在设置数据库调用时,您需要知道哪些参数可以返回某些内容,以便您可以适当地设置它们的方向。当你只传递一个字符串数组时,这几乎肯定是不可能的。

解决此问题的最佳方法是,正如其他人在 cmets 中建议的那样,将所有数据作为数据集返回。当前使用输出参数的任何现有过程都可以创建包装过程,该过程仅捕获输出参数,然后将它们放入您可以如上所述处理的选择语句中。

另一种选择是让Query 方法的调用者传递有关他们正在使用的参数的更多详细信息(例如输入或输出)。我个人更喜欢将所有数据作为选择返回而不是使用输出参数,因为它使这种代码更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多