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;
}
}
}
}
[解决办法]
好的。。接个分。。。

[解决办法]
久闻emit,先mark下
[解决办法]
mark。。
[解决办法]
对啊,分享下啊。