zoukankan      html  css  js  c++  java
  • 增加几个entity framework 的函数 (记录备忘)

    public static class DatabaseExtensions
    {
    public static DataTable SqlQueryForDataTatable(this Database db, string sql, params SqlParameter[] parameters)
    {

    SqlConnection conn = new System.Data.SqlClient.SqlConnection();
    conn.ConnectionString = db.Connection.ConnectionString;
    if (conn.State != ConnectionState.Open)
    {
    conn.Open();
    }
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;
    cmd.CommandText = sql;

    if (parameters.Length > 0)
    {
    foreach (var item in parameters)
    {
    cmd.Parameters.Add(item);
    }
    }


    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
    DataTable table = new DataTable();
    adapter.Fill(table);
    return table;
    }

    public static IEnumerable SqlQueryForDynamic(this Database db, string sql, params object[] parameters)
    {
    IDbConnection defaultConn = new System.Data.SqlClient.SqlConnection();
    return SqlQueryForDynamicOtherDB(db, sql, defaultConn, parameters);
    }

    public static IEnumerable SqlQueryForDynamicOtherDB(this Database db, string sql, IDbConnection conn, params object[] parameters)
    {
    conn.ConnectionString = db.Connection.ConnectionString;
    if (conn.State != ConnectionState.Open)
    {
    conn.Open();
    }

    IDbCommand cmd = conn.CreateCommand();
    cmd.CommandText = sql;

    IDataReader dataReader = cmd.ExecuteReader();

    if (!dataReader.Read())
    {
    return null; //无结果返回Null
    }

    #region 构建动态字段

    TypeBuilder builder = DatabaseExtensions.CreateTypeBuilder(
    "EF_DynamicModelAssembly",
    "DynamicModule",
    "DynamicType");

    int fieldCount = dataReader.FieldCount;
    for (int i = 0; i < fieldCount; i++)
    {
    //dic.Add(i, dataReader.GetName(i));

    //Type type = dataReader.GetFieldType(i);

    DatabaseExtensions.CreateAutoImplementedProperty(
    builder,
    dataReader.GetName(i),
    dataReader.GetFieldType(i));
    }

    #endregion

    dataReader.Close();
    dataReader.Dispose();
    cmd.Dispose();
    conn.Close();
    conn.Dispose();

    Type returnType = builder.CreateType();

    if (parameters != null)
    {
    return db.SqlQuery(returnType, sql, parameters);
    }
    else
    {
    return db.SqlQuery(returnType, sql);
    }
    }

    public static TypeBuilder CreateTypeBuilder(string assemblyName, string moduleName, string typeName)
    {
    TypeBuilder typeBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
    new AssemblyName(assemblyName),
    AssemblyBuilderAccess.Run).DefineDynamicModule(moduleName).DefineType(typeName,
    TypeAttributes.Public);
    typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
    return typeBuilder;
    }

    public static void CreateAutoImplementedProperty(TypeBuilder builder, string propertyName, Type propertyType)
    {
    const string PrivateFieldPrefix = "m_";
    const string GetterPrefix = "get_";
    const string SetterPrefix = "set_";

    // Generate the field.
    FieldBuilder fieldBuilder = builder.DefineField(
    string.Concat(
    PrivateFieldPrefix, propertyName),
    propertyType,
    FieldAttributes.Private);

    // Generate the property
    PropertyBuilder propertyBuilder = builder.DefineProperty(
    propertyName,
    System.Reflection.PropertyAttributes.HasDefault,
    propertyType, null);

    // Property getter and setter attributes.
    MethodAttributes propertyMethodAttributes = MethodAttributes.Public
    | MethodAttributes.SpecialName
    | MethodAttributes.HideBySig;

    // Define the getter method.
    MethodBuilder getterMethod = builder.DefineMethod(
    string.Concat(
    GetterPrefix, propertyName),
    propertyMethodAttributes,
    propertyType,
    Type.EmptyTypes);

    // Emit the IL code.
    // ldarg.0
    // ldfld,_field
    // ret
    ILGenerator getterILCode = getterMethod.GetILGenerator();
    getterILCode.Emit(OpCodes.Ldarg_0);
    getterILCode.Emit(OpCodes.Ldfld, fieldBuilder);
    getterILCode.Emit(OpCodes.Ret);

    // Define the setter method.
    MethodBuilder setterMethod = builder.DefineMethod(
    string.Concat(SetterPrefix, propertyName),
    propertyMethodAttributes,
    null,
    new Type[] { propertyType });

    // Emit the IL code.
    // ldarg.0
    // ldarg.1
    // stfld,_field
    // ret
    ILGenerator setterILCode = setterMethod.GetILGenerator();
    setterILCode.Emit(OpCodes.Ldarg_0);
    setterILCode.Emit(OpCodes.Ldarg_1);
    setterILCode.Emit(OpCodes.Stfld, fieldBuilder);
    setterILCode.Emit(OpCodes.Ret);

    propertyBuilder.SetGetMethod(getterMethod);
    propertyBuilder.SetSetMethod(setterMethod);
    }


    }

  • 相关阅读:
    Yet Another Monster Killing Problem
    Element Extermination
    最短路径
    Secret Passwords
    New Year Parties
    Water The Garden
    Zero Quantity Maximization
    Anya and Cubes
    代码规范&《数学之美》读后感
    带负边权的最短路径(有向图)——Bellman-Ford算法
  • 原文地址:https://www.cnblogs.com/leonsky/p/2938204.html
Copyright © 2011-2022 走看看