Необходимо получить пустые данные в .net с помощью схемы таблицы базы данных

Каков наилучший способ создания пустого объекта DataTable со схемой таблицы sql-сервера?

Ответы

Ответ 1

Я считаю, что стоит упомянуть SET FMTONLY:

SET FMTONLY ON;
SELECT * FROM SomeTable
SET FMTONLY OFF;

Никакие строки не обрабатываются или не отправляются клиенту из-за запроса, когда SET FMTONLY включен.

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

Ответ 2

Все эти решения верны, но если вы хотите, чтобы для этого сценария было оптимизировано чистое решение кода.

В этом решении нет данных, поскольку CommandBehavior.SchemaOnly указывается в функции ExecuteReader (Документация по командам)

Решение CommandBehavior.SchemaOnly добавит SET FMTONLY ON; sql до того, как запрос будет выполнен для вас, он сохранит ваш код в чистоте.

public static DataTable GetDataTableSchemaFromTable(string tableName, SqlConnection sqlConn, SqlTransaction transaction)
{
    DataTable dtResult = new DataTable();

    using (SqlCommand command = sqlConn.CreateCommand())
    {
        command.CommandText = String.Format("SELECT TOP 1 * FROM {0}", tableName);
        command.CommandType = CommandType.Text;
        if (transaction != null)
        {
            command.Transaction = transaction;
        }

        SqlDataReader reader = command.ExecuteReader(CommandBehavior.SchemaOnly);

        dtResult.Load(reader);

    }

    return dtResult;
}

Ответ 3

Try: SELECT TOP 0 * FROM [TableName]

и используйте SQLDataAdapter для заполнения DataSet, а затем получите таблицу из этого набора данных.

Ответ 4

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

select * from <tablename> where 1=2

в качестве исходного запроса.

Это вернет пустой набор результатов со структурой исходной таблицы.

Ответ 5

Вот что я сделал:

var conn = new SqlConnection("someConnString");
var cmd = new SqlCommand("SET FMTONLY ON; SELECT * FROM MyTable; SET FMTONLY OFF;",conn); 
var dt = new DataTable();
conn.Open();
dt.Load(cmd.ExecuteReader());
conn.Dispose();

Хорошо работает. Спасибо AdaTheDev.

Ответ 6

Class BlankTableWithSourceTableSchema
    Inherits DataTable
    Public Sub New(ByVal connstr As String, ByVal sourcetable As String)
        Try
            Using connection As SqlServerCe.SqlCeConnection = New SqlServerCe.SqlCeConnection(connstr)
                Dim adapter As SqlServerCe.SqlCeDataAdapter = New SqlServerCe.SqlCeDataAdapter("SELECT * FROM " & sourcetable, connection)
                adapter.TableMappings.Add("Table", "ABlankTable")
                adapter.FillSchema(Me, SchemaType.Mapped)
            End Using
        Catch ex As Exception
        End Try
    End Sub
End Class

Ответ 7

это работает:

Class BlankTableWithSourceTableSchema
    Inherits DataTable
    Public Sub New(ByVal connstr As String, ByVal sourcetable As String)
        Try
            Using connection As SqlServerCe.SqlCeConnection = New SqlServerCe.SqlCeConnection(connstr)
                Dim adapter As SqlServerCe.SqlCeDataAdapter = New SqlServerCe.SqlCeDataAdapter("SELECT * FROM " & sourcetable, connection)
                adapter.TableMappings.Add("Table", "ABlankTable")
                adapter.FillSchema(Me, SchemaType.Mapped)
            End Using
        Catch ex As Exception
        End Try
    End Sub
End Class

Ответ 8

Вы всегда можете создать свой собственный:

        DataTable table = new DataTable("TableName");

        table.Columns.Add(new DataColumn("Col1", typeof(int)));
        table.Columns.Add(new DataColumn("Col2", typeof(int)));
        table.Columns.Add(new DataColumn("Col3", typeof(string)));
        table.Columns.Add(new DataColumn("Col4", typeof(int)));
        table.Columns.Add(new DataColumn("Col5", typeof(string)));

Очевидным недостатком является то, что вам придется обновлять свой код всякий раз, когда изменяется схема базы данных.