我能找到的唯一引用是建议使用实体框架来做这件事,但是我没有或者没有使用实体框架。关于这个主题的另一件事是从SQL表转到C#类,这与我想要的正好相反。
这不必与TSQL/MSSQL (2014)兼容,但这是我的DBMS。
C#类只是一个POCO。我想我听说您可以接受这个类,并以某种方式将其转换为DataTable,然后使用SqlBulkCopy让它从DataTable创建一个表。
这就是我目前使用的方法,它使用SELECT到并将null转换为sqlType,以使列为空。如您所见,这是相当原始的,但主要是完成工作-我正在寻找较少的错误发生的方法。
var columnNames = GetColumnsToBeUpdated<T>().ToList();
var columnTypes = GetColumnsTypesToBeUpdated<T>().ToList();
var selects = columnNames.Select((t, i) => $"CAST(NULL as {columnTypes[i]}) AS [{t}]");
var createsql = $@"
SELECT {string.Join(", ", selects)}
INTO SDE.[{tableName}]";
using (var connection = new SqlConnection(_sdeConnectionString))
{
EsriServer.ExecuteNonQuery(connection, $"IF OBJECT_ID(N'SDE.[{tableName}]', N'U') IS NOT NULL " +
$"DROP TABLE SDE.[{tableName}]", null);
EsriServer.ExecuteNonQuery(connection, createsql, null);
EsriServer.ExecuteNonQuery(connection, $"TRUNCATE TABLE SDE.[{tableName}]", null);
}
private static string GetSqlDataType(Type type)
{
var name = type.Name;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
name = type.GetGenericArguments()[0].Name;
}
switch (name)
{
case "Guid":
return "uniqueidentifier";
case "Boolean":
return "bit";
case "Byte":
return "tinyint";
case "Int16":
return "smallint";
case "Int32":
return "int";
case "Int64":
return "bigint";
case "Decimal":
return "decimal(38,25)";
case "Single":
return "real";
case "Double":
return "float";
case "DateTime":
return "datetime";
case "String":
case "Char[]":
return "nvarchar(max)";
case "Char":
return "nvarchar(1)";
case "Byte[]":
return "varbinary";
case "Object":
return "sql_variant";
default:
throw new ArgumentOutOfRangeException();
}
}
private static IEnumerable<string> GetColumnsToBeUpdated<T>() where T : class, new()
{
var typeT = new T();
var ps = typeT.GetType().GetProperties();
var propertyNames = ps.Select(p => p.Name);
return propertyNames.Except(GetColumnsToBeIgnored<T>());
}
private static IEnumerable<string> GetColumnsTypesToBeUpdated<T>() where T : class, new()
{
var typeT = new T();
var ps = typeT.GetType().GetProperties();
return ps.Select(p => p.PropertyType).Select(GetSqlDataType).ToList();
}如果这不能准确地完成,或者需要大量代码,那么我可以使用一个应用程序或在线服务器,它允许我粘贴到一个简单的C#类中,并返回一个create语句。
发布于 2019-08-02 04:04:50
您可以将C#类转换为Json,然后将Json转换为Sql。
将C#类转换为Json:
将Json转换为SQL:
https://stackoverflow.com/questions/43552033
复制相似问题