2015-06-15 7 views
0

Я использовал пользовательский тип таблицы в качестве параметра хранимой процедуры. Но для типа таблицы с несколькими столбцами.Использовать определенный пользователем тип таблицы в качестве параметра хранимой процедуры

Для этого я должен генерировать DataTable следующим образом ::

 System.Data.DataTable processedTable = new System.Data.DataTable(); 

     processedTable.Columns.Add("DosID", typeof(long)); 
     processedTable.Columns.Add("PayLC", typeof(decimal)); 
     processedTable.Columns.Add("PayIC", typeof(decimal)); 

В коде выше, это было хорошо, чтобы сформировать DataTable только с 3 столбцами.

Но у меня есть хранимая процедура, для которой требуется таблица с 30 столбцами.

Есть ли лучший способ для создания этого DataTable в моем коде на C#?

+0

Разве это не ОК, чтобы установить таблицу, как вы делаете с таблицей с тремя столбцами? –

+0

У меня есть один параметр типа таблицы значений с 30 столбцами. Вот почему – Rahul

+1

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

ответ

0

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

0

Я не знаю, соответствует ли это вашему точному требованию или нет , но вы можете изменить код и использовать для динамической генерации ТАБЛИЦЫ

public void CreateUserDefinedTable(string tableName) 
{ 
    string connectionString = "Give your Connection String"; 
    string sqlQuery = "select c.name as COLUMN_NAME, t.name as TYPE_NAME,c.max_length as MAX_LENGTH " + 
         "from sys.columns c, sys.types t " + 
         "where c.object_id = (select type_table_object_id from sys.table_types where name = '"+tableName+"') " + 
         "and t.user_type_id = c.user_type_id " + 
         "order by c.column_id "; 
    string data = "", type = ""; 
    DataTable processedTable = new DataTable(); 
    DataColumn newcolumn = new DataColumn(); 
    DataSet ds = new DataSet(); 
    SqlConnection conObj = new SqlConnection(connectionString); 
    SqlCommand cmd = new SqlCommand(sqlQuery, conObj); 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    da.Fill(ds); 
    if (ds.Tables[0].Rows.Count > 0) 
    { 
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
     { 
      switch (ds.Tables[0].Rows[i]["TYPE_NAME"].ToString()) 
      { 
       case "varchar": 
        newcolumn = processedTable.Columns.Add(ds.Tables[0].Rows[i]["COLUMN_NAME"].ToString(), typeof(string)); 
        newcolumn.MaxLength = Convert.ToInt32(ds.Tables[0].Rows[i]["MAX_LENGTH"].ToString()); 
        break; 
       case "nvarchar": 
        newcolumn = processedTable.Columns.Add(ds.Tables[0].Rows[i]["COLUMN_NAME"].ToString(), typeof(string)); 
        newcolumn.MaxLength = Convert.ToInt32(ds.Tables[0].Rows[i]["MAX_LENGTH"].ToString()); 
        break; 
       case "char": 
        newcolumn= processedTable.Columns.Add(ds.Tables[0].Rows[i]["COLUMN_NAME"].ToString(), typeof(char)); 
        break; 
       case "int": 
        newcolumn = processedTable.Columns.Add(ds.Tables[0].Rows[i]["COLUMN_NAME"].ToString(), typeof(int)); 
        break; 
       case "float": 
        newcolumn = processedTable.Columns.Add(ds.Tables[0].Rows[i]["COLUMN_NAME"].ToString(), typeof(float)); 
        break; 
      } 
     } 
    } 

} 
+0

Здесь имя таблицы относится к типу, который вы создали в БД –

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