ResetDbType() public method

public ResetDbType ( ) : void
return void
コード例 #1
0
ファイル: SqlParameterTest.cs プロジェクト: nlhepler/mono
		public void ResetDbType ()
		{
			SqlParameter p;

			//Parameter with an assigned value but no DbType specified
			p = new SqlParameter ("foo", 42);
			p.ResetDbType ();
			Assert.AreEqual (DbType.Int32, p.DbType, "#A:DbType");
			Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#A:SqlDbType");
			Assert.AreEqual (42, p.Value, "#A:Value");

			p.DbType = DbType.DateTime; //assigning a DbType
			Assert.AreEqual (DbType.DateTime, p.DbType, "#B:DbType1");
			Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#B:SqlDbType1");
			p.ResetDbType ();
			Assert.AreEqual (DbType.Int32, p.DbType, "#B:DbType2");
			Assert.AreEqual (SqlDbType.Int, p.SqlDbType, "#B:SqlDbtype2");

			//Parameter with an assigned SqlDbType but no specified value
			p = new SqlParameter ("foo", SqlDbType.Int);
			p.ResetDbType ();
			Assert.AreEqual (DbType.String, p.DbType, "#C:DbType");
			Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#C:SqlDbType");

			p.DbType = DbType.DateTime; //assigning a SqlDbType
			Assert.AreEqual (DbType.DateTime, p.DbType, "#D:DbType1");
			Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#D:SqlDbType1");
			p.ResetDbType ();
			Assert.AreEqual (DbType.String, p.DbType, "#D:DbType2");
			Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#D:SqlDbType2");

			p = new SqlParameter ();
			p.Value = DateTime.MaxValue;
			Assert.AreEqual (DbType.DateTime, p.DbType, "#E:DbType1");
			Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#E:SqlDbType1");
			p.Value = null;
			p.ResetDbType ();
			Assert.AreEqual (DbType.String, p.DbType, "#E:DbType2");
			Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#E:SqlDbType2");

			p = new SqlParameter ("foo", SqlDbType.VarChar);
			p.Value = DateTime.MaxValue;
			p.ResetDbType ();
			Assert.AreEqual (DbType.DateTime, p.DbType, "#F:DbType");
			Assert.AreEqual (SqlDbType.DateTime, p.SqlDbType, "#F:SqlDbType");
			Assert.AreEqual (DateTime.MaxValue, p.Value, "#F:Value");

			p = new SqlParameter ("foo", SqlDbType.VarChar);
			p.Value = DBNull.Value;
			p.ResetDbType ();
			Assert.AreEqual (DbType.String, p.DbType, "#G:DbType");
			Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#G:SqlDbType");
			Assert.AreEqual (DBNull.Value, p.Value, "#G:Value");

			p = new SqlParameter ("foo", SqlDbType.VarChar);
			p.Value = null;
			p.ResetDbType ();
			Assert.AreEqual (DbType.String, p.DbType, "#G:DbType");
			Assert.AreEqual (SqlDbType.NVarChar, p.SqlDbType, "#G:SqlDbType");
			Assert.IsNull (p.Value, "#G:Value");
		}
コード例 #2
0
        private static void AddCompilationInfo(Type itemType)
        {
            var members = itemType.GetMembers();

            var props =
                members.Where(m => m.MemberType == MemberTypes.Property || m.MemberType == MemberTypes.Field)
                    .ToArray();

            var coercionParameter = new SqlParameter();

            var metaData = new SqlMetaData[props.Length];

            for (int index = 0; index < props.Length; index++)
            {
                var prop = props[index];

                if (index > 0)
                {
                    coercionParameter.ResetDbType();
                    coercionParameter.ResetSqlDbType();
                }

                switch (props[index].MemberType)
                {
                    case MemberTypes.Property:
                        coercionParameter.DbType = CommandManager.GetDbType(((PropertyInfo)prop).PropertyType) ??
                                                   DbType.Object;
                        break;
                    case MemberTypes.Field:
                        coercionParameter.DbType = CommandManager.GetDbType(((FieldInfo)prop).FieldType) ??
                                                   DbType.Object;
                        break;
                }
                metaData[index] = new SqlMetaData(prop.Name, coercionParameter.SqlDbType);
            }

            var bodyExpressions = new List<Expression>();

            var metaDataParameter = Expression.Parameter(typeof(SqlMetaData[]), "metaData");
            var itemParameter = Expression.Parameter(typeof(object), "item");
            var castedItemParameter = Expression.Variable(itemType, "castedItem");
            var recordVariable = Expression.Variable(typeof(SqlDataRecord), "record");

            bodyExpressions.Add(Expression.Assign(recordVariable,
                Expression.New(SqlDataRecordConstructorInfo, metaDataParameter)));

            bodyExpressions.Add(Expression.Assign(castedItemParameter,
                Expression.Convert(itemParameter, itemType)));

            for (int index = 0; index < props.Length; index++)
            {
                var mi = props[index];
                switch (mi.MemberType)
                {
                    case MemberTypes.Property:
                        bodyExpressions.Add(Expression.Call(recordVariable, SetValueMethodInfo,
                            new Expression[]
                                {
                                    Expression.Constant(index, typeof (int)),
                                    Expression.Convert(Expression.Property(castedItemParameter, itemType, mi.Name),
                                        typeof (object))
                                }));

                        break;
                    case MemberTypes.Field:
                        bodyExpressions.Add(Expression.Call(recordVariable, SetValueMethodInfo,
                            new Expression[]
                                {
                                    Expression.Constant(index, typeof (int)),
                                    Expression.Convert(Expression.Field(castedItemParameter, itemType, mi.Name),
                                        typeof (object))
                                }));
                        break;
                }
            }

            bodyExpressions.Add(recordVariable);

            var body = Expression.Block(new[] { recordVariable, castedItemParameter }, bodyExpressions);
            var lambda = Expression.Lambda<Func<SqlMetaData[], object, SqlDataRecord>>(body, metaDataParameter,
                itemParameter);

            CompiledFuncs.Add(itemType.AssemblyQualifiedName, new DelegateInfo { Func = lambda.Compile(), MetaData = metaData });
        }