2011-04-18 60 views
4

我想從我存儲的proc中獲取數據到我的數據集中。問題是,在數據集可視化工具中,實際的表名即客戶或員工不會顯示在表1,表2等中。 是否可以獲取實際的表名?具有實際表名的數據集

using (SqlConnection sqlConnection = new SqlConnection("Data Source=myserver;Initial Catalog=Northwind;Integrated Security=True")) 
     { 
      sqlConnection.Open(); 

      SqlDataAdapter da = new SqlDataAdapter("EXECUTE [Northwind].[dbo].[GetCustomers_Employees] ", sqlConnection); 
      DataSet ds = new DataSet(); 
      da.Fill(ds); 
     } 

CREATE PROCEDURE GetCustomers_Employees 
AS 
BEGIN 
SELECT top 10 * from customers 
select top 10 * from Employees 
END 

dataset visualizer

回答

4

當你做填充operatation,這樣你可以添加一個名字:

da.Fill(ds, "MyTable"); 

從此時開始,你可以參考下表規定

ds.Tables["MyTable"]; 

而不是使用整數索引(即ds.Tables[0]

在這裏看到:http://msdn.microsoft.com/en-us/library/bh8kx08z(v=VS.100).aspx

編輯:

在你的情況,你可以使用TableName屬性,像這樣:

da.Fill(ds); 
ds.Tables[0].TableName = "Customers"; 
ds.Tables[1].TableName = "Employees"; 

這是快速和骯髒的方法,但不是很一般。不幸的是,沒有辦法從SP獲取表的名字,這可能是你想要的。要做到這一點的一種方法是修改SP返回的輸出參數:

CREATE PROCEDURE GetCustomers_Employees 
    @tableNames varchar(20) OUTPUT 
AS 
BEGIN 
    SET @tableNames = 'Customers,Employees' 
    SELECT top 10 * from Customers 
    SELECT top 10 * from Employees 
END 

但要利用這一點,你也必須修改SqlDataAdapter來處理與輸出參數的存儲過程:

using (SqlConnection = ...) 
    { 
     // sqlConnection.Open(); // Not really needed. Data Adapter will do this. 

     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "GetCustomers_Employees"; 
     cmd.Connection = sqlConnection; 

     // Create the parameter object and add it to the command 
     SqlParameter param = new SqlParameter("@tableNames", SqlDbType.VarChar); 
     param.Direction = ParameterDirection.Output; 
     cmd.Parameters.Add(param); 

     // Get the Data 
     SqlDataAdapter da = new SqlDataAdapter(); 
     da.SelectCommand = cmd; 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 

     // Set the names of the tables in the dataset 
     string strTableNames = cmd.Parameters["@tableNames"].Value.ToString(); 
     string[] tableNames = strTableNames.split(','); 

     for (int i=0; i<tableNames.Length; i++) 
     { 
      ds.Tables[i].TableName = tableNames[i]; 
     } 
    } 

注意上面將處理任意數量的表退回,所以你可以很容易地封裝在這一個功能,這可能對您有用:

DataSet function(string storedProcedureName, string connectionString) 
{ 
    DataSet ds = new DataSet(); 
    ... // code above, without DataSet declaration 
    return ds; 
} 
+0

我比1個表嗎? – user603007 2011-04-19 00:16:36

+0

@ user603007請參閱答案中的其他信息。這有點痛苦,但我認爲沒有更簡單的方法。 – 2011-04-19 05:39:32

+0

另請參閱:http://support.microsoft.com/kb/322793 – bdwakefield 2011-12-06 13:49:10

相關問題