public DataParameterBuilder(Type queryType) { _queryType = Verify.ArgumentNotNull(queryType, "queryType"); PropertyInfo[] properties = queryType.GetProperties(); Dictionary<string, DataParameterInfo> namedParameters = null; Dictionary<int, DataParameterInfo> orderedParameters = null; foreach (PropertyInfo property in properties) { ParameterAttribute attribute = GetParameterAttribute(property); if (attribute.Ignore) { continue; } if (DataParameterTypeMapping.ForType(property.PropertyType) == null) { _errors.Add("Cannot handle property types of " + property.PropertyType.Name); } if (attribute.ParameterOrder > 0) { if (orderedParameters == null) { orderedParameters = new Dictionary<int, DataParameterInfo>(); } if (orderedParameters.ContainsKey(attribute.ParameterOrder)) { string message = string.Format("Properties {0} and {1} both have a parameter order of {2}", orderedParameters[attribute.ParameterOrder].Property.Name, property.Name, attribute.ParameterOrder); _errors.Add(message); } orderedParameters[attribute.ParameterOrder] = new DataParameterInfo(attribute, property); } else { if (namedParameters == null) { namedParameters = new Dictionary<string, DataParameterInfo>(); } string parameterName = SanitizeParameterName(attribute.ParameterName); if (namedParameters.ContainsKey(parameterName)) { _errors.Add("Parameter name is defined more than once: " + parameterName); } namedParameters[parameterName] = new DataParameterInfo(attribute, property); } } if (namedParameters != null && orderedParameters != null) { _errors.Add("Cannot have a mix of named properties and ordered properties"); } if (namedParameters != null) { _namedParameters = namedParameters; } else if (orderedParameters != null) { var array = new DataParameterInfo[orderedParameters.Count]; for (int index = 0; index < array.Length; ++index) { int propertyOrder = index + 1; DataParameterInfo property; if (orderedParameters.TryGetValue(propertyOrder, out property)) { array[index] = property; } else { _errors.Add("Missing property with order of " + propertyOrder); } } _orderedParameters = array; } }
private static string GetParameterNamePrefix(IDbCommand cmd, DataParameterInfo parameterInfo) { string typeName = cmd.GetType().FullName; if (typeName.StartsWith("System.Data.SqlClient") || typeName.StartsWith("System.Data.SqlServerCe")) { return "@"; } if (typeName.StartsWith("MySql")) { return "?"; } if (!Char.IsLetterOrDigit(parameterInfo.Attribute.ParameterName[0])) { return parameterInfo.Attribute.ParameterName[0].ToString(); } // TODO: probably need to look into postgres, firebird, etc return ":"; }