我使用了用户定义的表类型作为存储过程中的参数。 但对于只有很少列的表类型。
为此,我必须生成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 :(得分:0)
您需要以上代码来命名与表类型匹配的列。我能看到的唯一另一种方法是使用reflection
遍历属性并将列添加到datatable,每个列名与property的相同。但是,在这种方法中,您需要确保您的属性名称和数据类型列名称相同。
答案 1 :(得分:0)
我不知道这是否符合您的确切要求 但您可以修改代码并将其用于动态生成TABLE
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;
}
}
}
}