protected SqlCallParameterBase(ProcedureName procedureName, ProcedureParameter parameter, ParameterDirection direction, bool nullable, bool isEnumerable)
 {
     if (parameter == null) {
         throw new ArgumentNullException("parameter");
     }
     parameterName = parameter.ParameterName.Value;
     if (direction == ParameterDirection.ReturnValue) {
         throw new ArgumentOutOfRangeException("direction");
     }
     this.direction = direction;
     if (parameter.ParameterTypeName.IsQualified || (!knownDbTypes.TryGetValue(parameter.ParameterTypeName.Name.Value, out sqlType))) {
         sqlType = isEnumerable ? SqlDbType.Structured : SqlDbType.Udt;
     } else {
         TypeNameWithPrecision typeNameEx = parameter.ParameterTypeName.Name as TypeNameWithPrecision;
         if (typeNameEx != null) {
             switch (sqlType) {
             case SqlDbType.Binary:
             case SqlDbType.VarBinary:
             case SqlDbType.Char:
             case SqlDbType.VarChar:
             case SqlDbType.NChar:
             case SqlDbType.NVarChar:
                 size = (int)typeNameEx.Precision;
                 break;
             }
         }
     }
     this.nullable = nullable;
     if (direction == ParameterDirection.Input) {
         if (parameter.Output) {
             throw new InvalidOperationException(string.Format("The {0} OUTPUT argument requires an out parameter in {1}", parameterName, procedureName));
         }
     } else {
         if (!parameter.Output) {
             throw new InvalidOperationException(string.Format("An out parameter requires argument {0} to be OUTPUT in {1}", parameterName, procedureName));
         }
         if (sqlType == SqlDbType.Structured) {
             throw new NotSupportedException(string.Format("Table valued argument {0} must be READONLY in {1}", parameterName, procedureName));
         }
     }
 }
 public SqlCallParameterInfo(ISerializationTypeInfoProvider serializationTypeInfoProvider, ParameterInfo param, ProcedureName procedureName, ProcedureParameter script, ISerializationTypeMappingProvider typeMappingProvider)
     : base(procedureName, script, GetParameterDirection(param), GetParameterNullable(param), GetParameterEnumerable(param))
 {
     parameterInfo = param;
     if (SqlType == SqlDbType.Structured) {
         Type structuredType;
         if (!param.ParameterType.TryGetIEnumerableElementType(out structuredType)) {
             throw new ArgumentException("The given parameter must implement IEnumerable<> in order to be used as SQL structured parameter");
         }
         CreateTypeAsTableStatement createTableTypeScript;
         if (!AssemblyInventory.Get(param.Member.DeclaringType.Assembly).TryFind(script.ParameterTypeName.Name.Value, out createTableTypeScript)) {
             throw new ArgumentException(string.Format("The given structured parameter table type {0} cannot be found in the inventory", script.ParameterTypeName));
         }
         IDictionary<string, SqlColumnInfo> columnInfos;
         ISerializationTypeInfo info = serializationTypeInfoProvider.GetSerializationTypeInfo(structuredType);
         if (info.SimpleConverter != null) {
             string columnName = createTableTypeScript.TableDefinitions.OfType<TableColumnDefinition>().First(d => d.ColumnDefinition is TypedColumnDefinition).ColumnName.Value;
             columnInfos = new Dictionary<string, SqlColumnInfo>(1);
             columnInfos.Add(columnName, new SqlColumnInfo(typeMappingProvider.GetMapping(structuredType), columnName, info.SimpleConverter));
         } else {
             columnInfos = typeMappingProvider.GetMapping(structuredType).Columns;
             Attribute[] mappingAttributes = Attribute.GetCustomAttributes(param, typeof(SqlMappingAttribute), true);
             if ((mappingAttributes != null) && (mappingAttributes.Length > 0)) {
                 IDictionary<string, SqlColumnInfo> mappedColumnInfos = new Dictionary<string, SqlColumnInfo>(columnInfos);
                 foreach (SqlMappingAttribute mappingAttribute in mappingAttributes) {
                     mappedColumnInfos[mappingAttribute.TableTypeColumn] = columnInfos[mappingAttribute.SqlColumn];
                 }
                 columnInfos = mappedColumnInfos;
             }
         }
         structuredSchema = new StructuredParameterSchema(createTableTypeScript, columnInfos);
     }
     #warning Maybe implement more type compatibility checks for arguments here
     //			if ((sqlType == SqlDbType.Udt) && string.IsNullOrEmpty(arg.UserDefinedTypeName)) {
     //				userDefinedTypeName = SqlSerializationTypeMapping.GetClrUserDefinedTypeName(parameter.ParameterType, arg);
     //			}
 }
 public SqlCallParameterConstant(ProcedureName procedureName, ProcedureParameter parameter, object value)
     : base(procedureName, parameter, ParameterDirection.Input, value == null, false)
 {
     this.value = value;
 }