Назначение 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
хоть.