0

我有一个用于查询 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;
    }
4

1 回答 1

3

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

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

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

一旦您在过程上调用了适当的执行方法,那么这些输出参数的值将被填充并且可以从参数对象中检索。

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

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

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

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

于 2012-11-20T16:01:42.017 回答