2016-03-09 4 views
0

Я пытаюсь что-то новое (для меня, по крайней мере) и вместо того, чтобы иметь конкретные функции для вызова отдельных хранимых процедур (соотношение функций доступа к данным к 1 к 1), Я пытаюсь написать обобщенные функции, которым передано имя хранимой процедуры, а также строковые массивы имен параметров и значений параметров в качестве аргументов.C# - Обобщенные вызовы хранимых процедур SQL Server

Например:

public DataTable CallQuery(string spName, string[] paramNames, string[] paramValues, string connString) 
{ 
    DataTable dt = new DataTable(); 
    SqlConnection conn = new SqlConnection(connString); 

    try 
    { 
     //create a command and assign it to the passed stored procedure name 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; // new SqlConnection(connString); ; 
     cmd.CommandText = spName; 

     //add any and all parameters to the command 
     for(int i = 0; i < paramNames.Length; i++) 
     { 
       SqlParameter temp = new SqlParameter(paramNames[i], paramValues[i]); 
       cmd.Parameters.Add(temp); 
       //cmd.Parameters.AddWithValue(paramNames[i], paramValues[i]); 
     } 

     //get the data and return it 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(dt); 

     return dt; 
    } 
    catch (Exception) 
    { 
     return dt; 
    } 
} 

К сожалению, по некоторым причинам, когда я вызвать эту функцию со значениями параметров (т.е. paramNames [0] = "@Provider" и paramValues ​​[0] = "& НА Т") и сделать вызов базы данных, я поймаю исключение, заявив, что хранимая процедура ожидала параметр @Provider.

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

Причина, по которой я передаю строковые массивы, состоит в том, что в каждой хранимой процедуре может быть от 0 до 5 параметров (до сих пор ...).

+3

Вместо независимых массивов может быть лучше перейти в словарь, хэш-таблицы или общий список, так что легко сохранить имя параметра и его значение вместе. –

+0

Это, вероятно, имеет смысл, не так ли? Я получу это после того, как закончу тестирование остальной логики приложения. Благодаря! – jawood2005

ответ

2

Попробуйте указать тип для ваших параметров. Однако, самое главное, убедитесь, что вы делаете:

cmd.CommandType = CommandType.StoredProcedure; 
+0

OMG. Я дебил. Не могу поверить, что я забыл положить это, и это то, что вызывало мою проблему. Спасибо огромное! p.s. Я отмечу это как ответ через 6 минут, когда смогу. – jawood2005

+1

Легко пропустить. Вот почему у нас ТАК :) –

Смежные вопросы