Метод SqlCommand.Prepare требует, чтобы все параметры имели явно заданный тип

У меня есть следующий фрагмент кода в моей веб-службе WCF, который создает набор условий where в соответствии с форматированием значений предоставленного словаря.

public static Dictionary<string, string>[] VehicleSearch(Dictionary<string, string> searchParams, int maxResults)
{
    string condition = "";
    foreach (string key in searchParams.Keys)
    {
        //Split out the conditional in case multiple options have been set (i.e. SUB;OLDS;TOY)
        string[] parameters = searchParams[key].Split(';');
        if (parameters.Length == 1)
        {
            //If a single condition (no choice list) check for wildcards and use a LIKE if necessary
            string predicate = parameters[0].Contains('%') ? " AND {0} LIKE @{0}" : " AND {0} = @{0}";
            condition += String.Format(predicate, key);
        }
        else
        {
            //If a choice list, split out query into an IN condition
            condition += string.Format(" AND {0} IN({1})", key, string.Join(", ", parameters));
        }
    }

    SqlCommand cmd = new SqlCommand(String.Format(VEHICLE_QUERY, maxResults, condition));
    foreach (string key in searchParams.Keys)
        cmd.Parameters.AddWithValue("@" + key, searchParams[key]);
    cmd.Prepare();

Обратите внимание, что значения в словаре явно устанавливаются как строки и что они являются единственными элементами, передаваемыми в операторы AddWithValue. Это создает такой SQL:

SELECT TOP 200 MVINumber AS MVINumber
   , LicensePlateNumber
   , VIN
   , VehicleYear
   , MakeG
   , ModelG
   , Color
   , Color2
FROM [Vehicle_Description_v]
WHERE 1=1 AND VIN LIKE @VIN

И ошибки, говоря, что

System.InvalidOperationException: SqlCommand.Prepare method requires all parameters to have an explicitly set type.

Все поиски, которые я сделал, говорят, что мне нужно сообщить AddWithValueтип значений, которые я подготавливаю, но все мои подготовленные значения являются строками, и все примеры, которые я видел, не выполняют ничего лишнего, когда они работа со строками. Что мне не хватает?

5
задан marc_s 13 August 2012 в 17:08
поделиться