Необходимо получить пустые данные в .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)));
Очевидным недостатком является то, что вам придется обновлять свой код всякий раз, когда изменяется схема базы данных.