Допустимый запрос SQL Server, возвращающийся пустым в System.Data.SqlClient.SqlCommand - PullRequest
0 голосов
/ 07 февраля 2019

Вот мой запрос, это 2014 Adventure works.

DECLARE @l_RunSQL VARCHAR(MAX);

SELECT @l_RunSQL = COALESCE(@l_RunSQL + ' UNION ALL SELECT * FROM [', 'SELECT * FROM [') + TABLE_SCHEMA +'].['+ TABLE_NAME+']'
FROM INFORMATION_SCHEMA.TABLES
WHERE [TABLE_TYPE] = 'BASE TABLE'
  AND [TABLE_NAME] LIKE 'Address';

EXEC (@l_RunSQL)
    WITH RESULT SETS
         (
             (
                 [AddressID] [INT],
                 [AddressLine1] [NVARCHAR](60),
                 [AddressLine2] [NVARCHAR](60),
                 [City] [NVARCHAR](30),
                 [StateProvinceID] [INT],
                 [PostalCode] [NVARCHAR](15),
                 [SpatialLocation] [GEOGRAPHY],
                 [rowguid] [UNIQUEIDENTIFIER],
                 [ModifiedDate] [DATETIME]
             )
        );

Я могу запустить его в SSMS и получить содержимое таблицы Person.Address по желанию.

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

using (var reader = command.ExecuteReader(CommandBehavior.SchemaOnly))
{
     schemaTable = reader.GetSchemaTable();
}

И результаты чтения возвращаются пустыми.Почему эта команда действительна в SSMS, но не использует C #?

Соединение имеет тип System.Data.SqlClient.SqlConnection, а команда имеет тип System.Data.SqlClient.SqlCommand.

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 07 февраля 2019

Это потому, что вы выполняете с CommandBehavior.SchemaOnly, который возвращает только информацию о столбце, без данных, см. документация .

Запрос возвращает только информацию о столбце.При использовании SchemaOnly поставщик данных .NET Framework для SQL Server предшествует оператору, выполняемому с параметром SET FMTONLY ON.

Чтобы получить доступ к возвращенным данным из запроса, просто выполните, как показано ниже.

using (var reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        // Access your data here
        Console.WriteLine(String.Format("{0}", reader[0])); // Column AddressID
        // ...
    }
}
...