使用用户定义的表类型作为存储过程的参数

时间:2015-06-15 02:09:11

标签: c# sql sql-server stored-procedures

我使用了用户定义的表类型作为存储过程中的参数。 但对于只有很少列的表类型。

为此,我必须生成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

2 个答案:

答案 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;
            }
        }
    }

}