我正在使用.net核心和dapper,第一个没有DataTables,第二个使用它们用于TVP.
我试图将a转换List<T>为a List<SqlDataRecord>,使用此列表创建一个SqlParameter然后将其转换为DynamicParameter但遗憾的是我得到了:The member of type Microsoft.SqlServer.Server.SqlDataRecord cannot be used as a parameter value
玩了一下之后IDynamicParameters,我就开始了.
扩展方法 IEnumerable
public static DynamicWrapper toTVP<T>(this IEnumerable<T> enumerable, string tableName, string typeName)
{
List<SqlDataRecord> records = new List<SqlDataRecord>();
var properties = typeof(T).GetProperties().Where(p => Mapper.TypeToSQLMap.ContainsKey(p.PropertyType));
var definitions = properties.Select(p => Mapper.TypeToMetaData(p.Name, p.PropertyType)).ToArray();
foreach (var item in enumerable)
{
var values = properties.Select(p => p.GetValue(item, null)).ToArray();
var schema = new SqlDataRecord(definitions);
schema.SetValues(values);
records.Add(schema);
}
SqlParameter result = new SqlParameter(tableName, SqlDbType.Structured); …Run Code Online (Sandbox Code Playgroud) 如果您曾尝试在asp.net核心中使用SQLClient,您可能已经注意到缺少DataTables和DataSets,用于数据库I/O的表结构.
对于输出数据,我们可以选择SqlDataReader.但是对于输入数据,我还没有找到解决这个问题的方法 - 例如,如果你想通过框架461中的参数将表传递给SP,我们使用'SqlDbType = SqlDbType.Structured和DataTable class'.任何人的想法?
c# ×2
dapper ×2
.net ×1
.net-core ×1
asp.net-core ×1
datatable ×1
reflection ×1
sql ×1
sql-server ×1