наборы данных с фактическим именем таблицы - PullRequest
4 голосов
/ 18 апреля 2011

Я пытаюсь получить данные из моего сохраненного процесса в мой набор данных. Проблема в том, что в визуализаторе набора данных фактическое имя таблицы, то есть клиенты или сотрудники, не отображается только в таблице 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

1 Ответ

5 голосов
/ 18 апреля 2011

Вы можете добавить имя при выполнении операции заливки, например:

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;
}
...