Подтвердить что ты не робот

Как вы можете назвать таблицы Dataset, которые вы возвращаете в сохраненной процедуре?

У меня есть следующая хранимая процедура

Create procedure psfoo ()
AS
select * from tbA
select * from tbB

Затем я получаю доступ к данным следующим образом:

     Sql Command mySqlCommand = new SqlCommand("psfoo" , DbConnection)
     DataSet ds = new DataSet();
     mySqlCommand.CommandType = CommandType.StoredProcedure;
     SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter();
     mySqlDataAdapter.SelectCommand = mySqlCommand;
     mySqlDataAdapter.Fill(ds);

Теперь, когда я хочу получить доступ к моим таблицам, я должен это сделать:

     DataTable datatableA = ds.Tables[0];
     DataTable datatableB = ds.Tables[1];

Свойство Tables dataset также получает аксессор по строке (вместо int).

Можно ли указать имя таблиц в SQL-коде, чтобы я мог вместо этого написать следующее:

     DataTable datatableA = ds.Tables["NametbA"];
     DataTable datatableB = ds.Tables["NametbB"];

Я использую SQL Server 2008, если это имеет значение.

4b9b3361

Ответ 1

Насколько я знаю, из хранимой процедуры вы не можете этого сделать. Однако вы можете установить имена после того, как вы извлекли DataSet, а затем используйте их с тех пор.

ds.Tables[0].TableName = "NametbA";

Ответ 2

Сохраненная процедура:

    select 'tbA','tbB','tbC' 
    select * from tbA
    select * from tbB
    select * from tbC

передний конец:

       int i = 1;
       foreach (string tablename in dsEmailData.Tables[0].Rows[0][0].ToString().Split(','))
       {
           dsEmailData.Tables[i++].TableName = tablename;
       }

Надеюсь, что это поможет

Ответ 3

Есть ли причина, по которой вы не можете назвать их вручную после заполнения DataSet?

mySqlDataAdapter.Fill(ds);
ds.Tables[0].TableName = "NametbA";
ds.Tables[1].TableName = "NametbB";

Я не знаю, как назвать DataTables, которые возвращаются как часть множества наборов результатов из хранимой процедуры, но если вы знаете, что хранит процесс proc, тогда их ручное присвоение должно работать нормально.

Edit

Зная, что вы контролируете хранимую процедуру, одной из альтернатив может быть добавление столбца к наборам результатов, которые представляют имя таблицы. Тогда вы можете сделать что-то вроде:

foreach (DataTable table in ds.Tables)
{
    table.TableName = table.Rows[0]["TableName"].ToString();
}

Однако это зависит от наборов результатов, возвращающихся из хранимых процедур, фактически содержащих строки. Если они не содержат строк, вам придется обернуть их в оператор "if", и не каждая таблица получит имя.

Ответ 4

хорошая идея, тем лучше ваша процедура возвращает три набора результатов вместо добавления имени таблицы в

firs trow of each table
select 'tbA' FirstTableName,'tbB' SecondTableName
select * from tbA
select * from tbB

каждый раз, когда вы выполняете процедуру, таблицы [0] будут иметь строку, которая держит follwing select tablenames

Еще одна идея - передать имя таблицы в качестве выходного параметра процедуры

Create procedure psfoo (@tb1 varchar(50) output,@tb2 varchar(50) output)
AS
set @tb1='tbA'
set @tb2 'tbB'
select * from tbA
select * from tbB

Если эти методы ограничивают вас и выбирают переменные, вы можете создать процедуру, подобную этой

Create procedure psfoo ()
    AS
    select * from tbA
    select * from tbB
return 'tbA,tbB'

и путем расщепления значения возвращаемой процедуры в строку [] вы можете получить имя таблиц по порядку

[email protected](new char[]{','});
string tablenam1=returnvalue[0];
string tablenam2=returnvalue[1];

Ответ 5

Чтобы дать имена всей таблице в наборе данных, нам нужно написать еще один запрос select в конце SP или T-Sql.

    lsqry = New System.Text.StringBuilder
lsqry.AppendLine("select * from Bill_main")
lsqry.AppendLine("select * from serviceonly")
lsqry.AppendLine("select * from PendingService")
lsqry.AppendLine("select * from T_servicebillhd")
lsqry.AppendLine("select 'Bill_Main','serviceonly','PendingService','T_servicebillhd'")

Using con As New SqlConnection(lsConnection)
    Try
        con.Open()
        Using cmd As SqlCommand = con.CreateCommand
            With cmd
                .CommandText = lsqry.ToString
                .CommandType = CommandType.Text
            End With
            Using da As New SqlDataAdapter(cmd)
                da.Fill(DS)
            End Using
        End Using

        For li As Integer = 0 To DS.Tables.Count - 2
            DS.Tables(li).TableName = DS.Tables(DS.Tables.Count - 1).Rows(0).Item(li)
        Next
    Catch ex As Exception

    End Try
End Using

В приведенном выше примере я использую инструкцию t-sql вместо SP. В которой я написал 4 select query, а last - имя таблицы этих таблиц. И получить последнюю таблицу, которая содержит имена таблиц и назначить ее таблице, используя свойство TableName.

Ответ 6

Это работает для меня, но для получения ожидаемых имен таблиц требуется дополнительная работа:

    Dim tableCount As Integer = 3
    Dim tables(tableCount) As DataTable
    tables(0) = (New DataTable("Employee"))
    tables(1) = (New DataTable("Manager"))
    tables(2) = (New DataTable("Department"))
    dsUControlData.Tables.Add(tables(0))
    dsUControlData.Tables.Add(tables(1))
    dsUControlData.Tables.Add(tables(2))

    'Fill required tables
    da.Fill(0, 0, tables)

    Return dsUControlData

Ответ 7

Вы можете вернуть дополнительный набор результатов, который называет таблицы следующим образом:

SELECT 'firstTableName' AS tbl
UNION
SELECT 'secondTableName' AS tbl
UNION
...

Если это был первый набор результатов, вы можете использовать его для обозначения последующих наборов результатов по ходу.

Ответ 8

У меня есть один сохраненный proc, который обращается ко всем данным на моем предприятии и возвращает несколько наборов результатов. Для меня имеет смысл делать выбор с именем перед каждым набором результатов. Например:

SELECT 'Customers' AS TableName
SELECT ID, Name FROM dbo.Customer
SELECT 'Orders' AS TableName
SELECT ID, Created FROM dbo.[Order]

Затем, когда я перебираю таблицы MyDataSet.Tables, у меня есть только одна логика с прямым циклом и прямым поиском. Нет таблицы мастеров метаданных, чтобы не отставать. Это даже работает, когда таблицы не возвращаются. Если данные таблицы не возвращаются, соответствующие метаданные не возвращаются, что имеет смысл для меня.

For Each DataTable As DataTable In MyDataSet.Tables
  MyDataSet.Tables(MyDataSet.Tables.IndexOf(DataTable) + 1).TableName = DataTable.Rows(0)("TableName")
Next

Если я хочу добавить больше столбцов в таблицы метаданных, я могу.

Ответ 9

Я знаю, что это очень старый пост, но чтобы ответить... Да, это возможно. Просто добавьте "TableName" в вызов dataadapter Fill..

MyDataAdapter.Fill(ds, "TableName");  

Я парень на С#, но вы понимаете.

Ответ 10

Я знаю, что это старый вопрос, но я думал о том, чтобы делать то же самое сегодня, поэтому я не просто перебирал индекс набора данных результатов. Потому что, если хранимая процедура изменится в порядке выбора кода .net, выскочите.

Я придумал решение добавить столбец в результирующий набор с именем таблицы и использовать оператор case, чтобы увидеть, существует ли столбец в таблице. Но мне показалось, что я двигаю кодом. Просто сделал SQL статическим. Кроме того, если у вас есть столбец с именем тот же в другой таблице. Хромой...

myDS.Tables(i).Columns.Contains("TableName")

Ответ 11

Вы можете попробовать следующее:

добавить строку ниже в вашей процедуре

Select 'TableName1','TableName2';

Использование С#:

for (var i=0;i<ds.Tables[0].Columns.Count;i++)
 {
    ds.Tables[i + 1].TableName = ds.Tables[0].Columns[i].ColumnName;

  }

Ответ 12

Попробуйте это

YourDataAdapter.Fill(ds, "Table");

Ответ 13

Попробуйте это. В MS SQL 2008 R2 я всегда использую это.

mySqlDataAdapter.Fill(ds,"NameTableA");

Ответ 14

следует использовать select в "yourtablename" из оригинала, это просто пример, найти правильный синтаксис select в statement.

Это правильный способ сделать это для вашего требования. Thankyou.

Ответ 15

Возможно, это может быть работа вокруг

 Create procedure psfoo ()
 AS
 select * ,'tbA' as TableName from tbA
 select * ,'tbB' as TableName from tbB

Затем в коде С#

     foreach (DataTable dt in ds.Tables)
        {
            if (dt.Rows[0]["TableName"].ToString().Contains("tbA"))
            {

            }
            else if (dt.Rows[0]["TableName"].ToString().Contains("tbB"))
            {

            }
        }