首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

C# Emit有关问题->DataReader 转Entity.

2013-07-08 
C#Emit问题-DataReader 转Entity....本帖最后由 wangping_li 于 2011-06-29 14:42:22 编辑正常读取reader

C# Emit问题->DataReader 转Entity....
本帖最后由 wangping_li 于 2011-06-29 14:42:22 编辑 正常读取reader.GetInt32的方法如下:

 

il.Emit(OpCodes.Ldloc_S, item);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldloc_S, colIndices[i]);
                il.Emit(OpCodes.Callvirt, DataRecord_GetInt32);
                il.Emit(OpCodes.Callvirt, columnInfoes[i].SetMethod);


现在加了一个判断,就是当值为IsDBNull的时候,则取DefaultValue,代码如下:

 var local = il.DeclareLocal(columnInfoes[i].Type);//int i
                Label intNull = il.DefineLabel();//is null lable
                Label intCommon = il.DefineLabel();//not null lable              

                il.Emit(OpCodes.Ldloca, local);
                il.Emit(OpCodes.Ldarg_0);//将索引 0 处的局部变量i加载到计算堆栈上->i
                il.Emit(OpCodes.Ldloc_S, colIndices[i]);//index ->为IsDBNull(index)的参数
                il.Emit(OpCodes.Callvirt, DataRecord_IsDBNull);
                il.Emit(OpCodes.Brtrue_S, intNull);//如果is null则转向intNull标签

                il.Emit(OpCodes.Ldarg_0);//i
                il.Emit(OpCodes.Ldloc_S, colIndices[i]);
                il.Emit(OpCodes.Callvirt, DataRecord_GetInt32);
                il.Emit(OpCodes.Br_S, intCommon);//is not null则转向intCommon标签

                //is null
                il.MarkLabel(intNull);
                il.Emit(OpCodes.Ldc_I4, columnInfoes[i].DefaultValue);//为null时这里赋值

                //not null
                il.MarkLabel(intCommon);
                il.Emit(OpCodes.Ldloc_S, item);
                il.Emit(OpCodes.Ldloc, local);
                il.Emit(OpCodes.Callvirt, columnInfoes[i].SetMethod);


异常信息如下:

未经处理的异常:  System.InvalidProgramException: JIT 编译器遇到内部限制。


   在 (IDataReader )...

由于对IL不是很熟,希望大家帮忙看下,谢谢。。


[解决办法]
崇拜,你这是直接操作 IL 指令吗??
[解决办法]
介绍你用好东东,一个特殊的DataReader 


using System;
using System.Collections.Generic;
using System.Text;

namespace Galsun.DALProfile
{
    public interface INullableReader
    {
        // Methods
        bool GetBoolean(string name);
        byte GetByte(string name);
        char GetChar(string name);
        DateTime GetDateTime(string name);
        decimal GetDecimal(string name);
        double GetDouble(string name);
        Guid GetGuid(string name);
        short GetInt16(string name);
        int GetInt32(string name);
        long GetInt64(string name);
        float GetSingle(string name);
        string GetString(string name);
        object GetValue(string name);
        bool IsDBNull(string name);

    }
}




using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Galsun.DALProfile
{
    public sealed class NullableDataReader : IDataReader, IDisposable, IDataRecord, INullableReader
    {
        private IDataReader reader;

        public NullableDataReader(IDataReader dataReader)
        {
            this.reader = dataReader;
        }

        public void Close()
        {
            this.reader.Close();
        }


        public void Dispose()
        {
            if (this.reader != null)
            {


                this.reader.Dispose();
            }
        }

        public bool GetBoolean(int i)
        {
            return this.reader.GetBoolean(i);
        }
        public bool GetBoolean(string name)
        {
            bool boolean = false;
            if (!this.IsDBNull(name))
            {
                boolean = this.GetBoolean(this.reader.GetOrdinal(name));
            }
            return boolean;
        }
        public byte GetByte(int i)
        {
            return this.reader.GetByte(i);
        }
        public byte GetByte(string name)
        {
            return this.GetByte(this.reader.GetOrdinal(name));
        }
        public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
        {
            return this.reader.GetBytes(i, fieldOffset, buffer, bufferoffset, length);
        }
        public char GetChar(int i)
        {
            return this.reader.GetChar(i);
        }
        public char GetChar(string name)
        {
            return this.GetChar(this.reader.GetOrdinal(name));
        }
        public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
        {
            return this.reader.GetChars(i, fieldoffset, buffer, bufferoffset, length);
        }
        public IDataReader GetData(int i)
        {
            return this.reader.GetData(i);
        }



        public string GetDataTypeName(int i)
        {
            return this.reader.GetDataTypeName(i);
        }

        public string GetDataTypeName(string name)
        {
            return this.reader.GetDataTypeName(this.reader.GetOrdinal(name));
        }
        public DateTime GetDateTime(int i)
        {
            return this.reader.GetDateTime(i);
        }
        public DateTime GetDateTime(string name)
        {
            if (this.IsDBNull(name))
            {
                return DateTime.Now;
            }
            return this.reader.GetDateTime(this.reader.GetOrdinal(name));
        }
        public decimal GetDecimal(int i)
        {
            return this.reader.GetDecimal(i);
        }
        public decimal GetDecimal(string name)
        {
            decimal @decimal = 0M;
            if (!this.IsDBNull(name))
            {
                @decimal = this.reader.GetDecimal(this.reader.GetOrdinal(name));
            }
            return @decimal;
        }
        public double GetDouble(int i)
        {
            return this.reader.GetDouble(i);
        }
        public double GetDouble(string name)
        {
            double num = 0.0;
            if (!this.IsDBNull(name))
            {
                num = this.reader.GetDouble(this.reader.GetOrdinal(name));
            }
            return num;


        }

        public Type GetFieldType(int i)
        {
            return this.reader.GetFieldType(i);
        }
        public Type GetFieldType(string name)
        {
            return this.reader.GetFieldType(this.reader.GetOrdinal(name));
        }
        public float GetFloat(int i)
        {
            return this.reader.GetFloat(i);
        }
        public Guid GetGuid(int i)
        {
            return this.reader.GetGuid(i);
        }
        public Guid GetGuid(string name)
        {
            return this.reader.GetGuid(this.reader.GetOrdinal(name));
        }
        public short GetInt16(int i)
        {
            return this.reader.GetInt16(i);
        }
        public short GetInt16(string name)
        {
            if (this.IsDBNull(name))
            {
                return 0;
            }
            return this.reader.GetInt16(this.reader.GetOrdinal(name));
        }
        public int GetInt32(int i)
        {
            return this.reader.GetInt32(i);
        }

        public int GetInt32(string name)
        {
            if (this.IsDBNull(name))
            {
                return 0;
            }
            return this.reader.GetInt32(this.reader.GetOrdinal(name));
        }
        public long GetInt64(int i)
        {
            return this.reader.GetInt64(i);


        }
        public long GetInt64(string name)
        {
            if (this.IsDBNull(name))
            {
                return 0L;
            }
            return this.reader.GetInt64(this.reader.GetOrdinal(name));
        }
        public string GetName(int i)
        {
            return this.reader.GetName(i);
        }
        public DateTime? GetNullableDateTime(string name)
        {
            if (this.IsDBNull(name))
            {
                return null;
            }
            return new DateTime?(this.reader.GetDateTime(this.reader.GetOrdinal(name)));
        }
        public int GetOrdinal(string name)
        {
            return this.reader.GetOrdinal(name);
        }
        public DataTable GetSchemaTable()
        {
            return this.reader.GetSchemaTable();
        }
        public float GetSingle(string name)
        {
            float @float = 0f;
            if (!this.IsDBNull(name))
            {
                @float = this.reader.GetFloat(this.reader.GetOrdinal(name));
            }
            return @float;
        }
        public string GetString(int i)
        {
            return this.reader.GetString(i);
        }

        public string GetString(string name)
        {
            string str = string.Empty;
            if (!this.IsDBNull(name))


            {
                str = this.reader.GetString(this.reader.GetOrdinal(name));
            }
            return str;
        }
        public object GetValue(int i)
        {
            return this.reader.GetValue(i);
        }
        public object GetValue(string name)
        {
            return this.reader.GetValue(this.reader.GetOrdinal(name));
        }
        public int GetValues(object[] values)
        {
            return this.reader.GetValues(values);
        }

        public bool IsDBNull(int i)
        {
            return this.reader.IsDBNull(i);
        }

        public bool IsDBNull(string name)
        {
            return this.reader.IsDBNull(this.reader.GetOrdinal(name));
        }

        public bool NextResult()
        {
            return this.reader.NextResult();
        }

        public bool Read()
        {
            return this.reader.Read();
        }
        public int Depth
        {
            get
            {
                return this.reader.Depth;
            }
        }
        public int FieldCount
        {
            get
            {
                return this.reader.FieldCount;
            }
        }
        public bool IsClosed
        {


            get
            {
                return this.reader.IsClosed;
            }
        }
        public object this[int i]
        {
            get
            {
                return this.reader[i];
            }
        }
        public object this[string name]
        {
            get
            {
                return this.reader[name];
            }
        }

        public int RecordsAffected
        {
            get
            {
                return this.reader.RecordsAffected;
            }
        }
 
    }
}


[解决办法]

好的。。接个分。。。C#  Emit有关问题->DataReader 转Entity.
[解决办法]
久闻emit,先mark下
[解决办法]
mark。。
[解决办法]
引用:
弄好了,散分咯,要的来接哦.//
对啊,分享下啊。

热点排行