Назначение SqlParameter.Value без знания типа или использования массива смешанного типа

У меня есть слой данных, над которым я работаю, который трижды вызывает базу данных с помощью трех разных хранимых процедур. Первоначально я создал три разные функции для получения трех измерений результатов. Первый возвращает одно значение, второй - целую строку, а третий - таблицу. Они также принимают различные параметры. Первый занимает два varchars, второй два ints, и последние три varchars. Если я попытаюсь придумать и объединить все это, как показано ниже, у меня будут проблемы?

public void CallStoredProcedure(string[] astrParams, string strConnectionString, string strStoredProcedure)
{
    int nParams = 0;
    SqlParameter[] asqlParams;
    asqlParams = SqlHelperParameterCache.GetSpParameterSet(strConnectionString, strStoredProcedure);
    foreach (string strParam in astrParams)
    {
        asqlParams[nParams].Value = strParam;
        nParams++;
    }
}

Альтернативно, могу ли я использовать массив смешанных типов данных, не зная, что там, и могу ли я назначать разные типы в один и тот же массив, заменяя элементы?

object[] aParams;
string strName = "Joe";
long lngHeight = 180;
object[0] = strName;
object[1] = lngHeight;
CallStoredProcedure(aParams, strConnectionString, "StoredProcedure1")

long lngWeight = 3;
string strItemName = "Bookend";
object[0] = lngWeight;
object[1] = strItemName;
CallStoredProcedure(aParams, strConnectionString, "StoredProcedure2")

А затем измените код внутри этой функции на:

foreach (object oParam in astrParams)
{
    asqlParams[nParams].Value = oParam;
    nParams++;
}

Нужно ли мне использовать ToString() в одном или обоих этих случаях? И если да, то превращает ли это их в одно и то же? Как я уже сказал, сейчас у меня есть три функции, которые принимают все правильно введенные параметры, но я пытаюсь избавиться от дублирующего кода, если это возможно.

2 ответа

Решение

Я был довольно смущен тем, что мне нужно было сделать с моим первоначальным вопросом. Я понял, что мне не нужно беспокоиться о типах C# при добавлении параметров, так как GetSpParameterSet вытягивает всю необходимую мне информацию в массив SqlParameter и сбрасывает массив каждый раз, когда я его вызываю. Итак, мой исходный код:

foreach (string strParam in astrParams)
{
    asqlParams[nParams].Value = strParam;
    nParams++;
}

... просто будет работать для моих нужд. Там не будет никаких проблем с назначением C# string введите в SQL int тип, который был моей главной заботой, так как языки в любом случае не имеют идентичных типов. Я знаю, что мне не придется беспокоиться о чем-то вроде "х" int тип, потому что все значения, которые я использую, уже извлекаются из правильно типизированных столбцов в других запросах SQL. Поэтому мне не понадобятся массивы объектов.

Вы не можете иметь массив разных типов данных, вы можете иметь массив объектов и приводить отдельные элементы к определенному типу данных при сохранении значений в типизированную переменную.

Не уверен, где вы хотите использовать ToString() но если это когда вы сохраняете строку в массиве Object, это не имеет смысла, но если вы сохраняете объект в строковую переменную, тогда да, вам нужно сделать это:

string str = objectArray[0].ToString();

Я бы избежал всего этого беспорядка и следовал тому, что сказал DJ KRAZE, и добавил ваши параметры через Parameter.AddWithValue хоть.

Другие вопросы по тегам