private SqlExpression ExtractParameter(SqlExpression expr)
		{
			Type clrType = expr.ClrType;
			if(expr.ClrType.IsValueType && !TypeSystem.IsNullableType(expr.ClrType))
			{
				clrType = typeof(Nullable<>).MakeGenericType(expr.ClrType);
			}
			this.externals.Add(expr);
			SqlParameter sp = new SqlParameter(clrType, expr.SqlType, "@x" + (this.parameters.Count + 1), expr.SourceExpression);
			this.parameters.Add(sp);
			return sp;
		}
		private SqlParameter InsertLookup(SqlValue cp)
		{
			SqlParameterInfo pi = null;
			if(!this.map.TryGetValue(cp, out pi))
			{
				SqlParameter p;
				if(this.timeProviderType == null)
				{
					p = new SqlParameter(cp.ClrType, cp.SqlType, this.parameterizer.CreateParameterName(), cp.SourceExpression);
					pi = new SqlParameterInfo(p, cp.Value);
				}
				else
				{
					p = new SqlParameter(cp.ClrType, this.timeProviderType, this.parameterizer.CreateParameterName(), cp.SourceExpression);
					pi = new SqlParameterInfo(p, ((DateTime)cp.Value).TimeOfDay);
				}
				this.map.Add(cp, pi);
				this.currentParams.Add(pi);
			}
			return pi.Parameter;
		}
Exemple #3
0
 internal virtual SqlExpression VisitParameter(SqlParameter p) {
     return p;
 }
		internal override SqlExpression VisitParameter(SqlParameter p)
		{
			SqlParameter n = new SqlParameter(p.ClrType, p.SqlType, p.Name, p.SourceExpression);
			n.Direction = p.Direction;
			return n;
		}
		internal override SqlExpression VisitClientParameter(SqlClientParameter cp)
		{
			if(cp.SqlType.CanBeParameter)
			{
				SqlParameter p = new SqlParameter(cp.ClrType, cp.SqlType, this.parameterizer.CreateParameterName(), cp.SourceExpression);
				this.currentParams.Add(new SqlParameterInfo(p, cp.Accessor.Compile()));
				return p;
			}
			return cp;
		}
		private bool RetypeOutParameter(SqlParameter node)
		{
			if(!node.SqlType.IsLargeType)
			{
				return false;
			}
			ProviderType newType = this.parameterizer.TypeProvider.GetBestLargeType(node.SqlType);
			if(node.SqlType != newType)
			{
				node.SetSqlType(newType);
				return true;
			}
			// Since we are dealing with a long out parameter that hasn't been
			// retyped, we need to annotate
			this.parameterizer.Annotations.Add(
											   node,
				new CompatibilityAnnotation(
					Strings.MaxSizeNotSupported(node.SourceExpression), SqlServerProviderMode.Sql2000));
			return false;
		}
		internal override SqlStoredProcedureCall VisitStoredProcedureCall(SqlStoredProcedureCall spc)
		{
			this.VisitUserQuery(spc);

			for(int i = 0, n = spc.Function.Parameters.Count; i < n; i++)
			{
				MetaParameter mp = spc.Function.Parameters[i];
				SqlParameter arg = spc.Arguments[i] as SqlParameter;
				if(arg != null)
				{
					arg.Direction = this.GetParameterDirection(mp);
					if(arg.Direction == ParameterDirection.InputOutput ||
					   arg.Direction == ParameterDirection.Output)
					{
						// Text, NText and Image parameters cannot be used as output parameters
						// so we retype them if necessary.
						RetypeOutParameter(arg);
					}
				}
			}

			// add default return value 
			SqlParameter p = new SqlParameter(typeof(int?), this.parameterizer.TypeProvider.From(typeof(int)), "@RETURN_VALUE", spc.SourceExpression);
			p.Direction = Data.ParameterDirection.Output;
			this.currentParams.Add(new SqlParameterInfo(p));

			return spc;
		}
		internal SqlParameterInfo(SqlParameter parameter)
		{
			this.parameter = parameter;
		}
		internal SqlParameterInfo(SqlParameter parameter, object value)
		{
			this.parameter = parameter;
			this.value = value;
		}
		internal SqlParameterInfo(SqlParameter parameter, Delegate accessor)
		{
			this.parameter = parameter;
			this.accessor = accessor;
		}