我有一个用于查询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;
}
答案 0 :(得分:3)
它不会那么容易,但它是可能的。我假设DB2Parameter与本答案中的SqlParameter基本相同......
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx和相关页面在我在这里说的之后(或期间)会很有用。
基本上在使用输出参数调用过程时,您可以按照通常的方式调用它。对于输出参数,您可以正常传递对象,但参数对象上有一个Direction
属性,允许您指定它是输出参数。
在程序上调用适当的执行方法后,将填充这些输出参数的值,并可从参数对象中检索。
将它们放入DataTable然后由您决定。您可以创建一个数据表,为每个输出参数添加一个列,然后添加一行包含所有值。
这个问题的主要问题当然是在设置数据库调用时,你需要知道哪些参数是goign返回的东西,这样你就可以适当地设置它们的方向。当你只传递一个字符串数组时,这几乎肯定是不可能的。
最好的方法是像其他人在评论中建议的那样将所有数据作为数据集返回。当前使用输出参数的任何现有过程都可以创建包装程序,只捕获输出参数,然后将它们放入可以按上述方法处理的select语句中。
另一个选项是让Query
方法的调用者传递有关他们正在使用的参数的更多详细信息(例如in或out)。我个人更喜欢将所有数据作为选择而不是使用输出参数,因为它使这种代码更简单。