2015-06-15 95 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)); 

在上面的代碼,這是確定只有3列,以形成一個DataTable

但我有一個存儲過程,需要一個30列的表。

有沒有更好的方法在我的C#代碼中創建DataTable

+0

的是它不OK設置你的表像你一樣與3列表? –

+0

我有一個30列的表值型參數SP。那就是爲什麼 – Rahul

+1

您需要編寫這段代碼來命名應與表類型匹配的列。我能看到的唯一方法是使用反射遍歷屬性並將列添加到數據表中,每列名稱與屬性相同。但是,在這種方法中,您需要確保您的屬性名稱和數據類型列名稱相同。 – DarkKnight

回答

0

您需要使用上面的代碼來命名應與表類型匹配的列。我能看到的唯一方法是使用reflection遍歷屬性並將列添加到數據表中,每列名稱與屬性相同。但是,在這種方法中,您需要確保您的屬性名稱和數據類型列名稱相同。

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

這裏的表名是指你在數據庫中創建的類型 –

相關問題