【问题标题】:Use User defined Table Type as a parameter to Stored Procedure使用用户定义的表类型作为存储过程的参数
【发布时间】:2015-06-15 02:09:11
【问题描述】:

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

为此,我必须按如下方式生成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?

【问题讨论】:

  • 像 3-column-table 那样设置表格不好吗?
  • 我有一个 30 列的表值类型参数 SP。这就是为什么
  • 您需要编写此代码来命名应与表类型匹配的列。我能看到的唯一方法是使用反射来遍历属性并将列添加到数据表中,每个列的名称与属性的名称相同。但是,在这种方法中,您需要确保您的属性名称和数据类型列名称相同。
  • @Rahul :我认为定义 30-column-table-type 是一个很小的努力,因为你只做一次 :)
  • @HeinzSiahaan ;谢谢:D,这是我拥有的选项之一。但我只是在想如何优化这行代码。

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


【解决方案1】:

您需要上面的代码来命名应与表类型匹配的列。我能看到的唯一其他方法是使用reflection 遍历属性并将列添加到数据表中,每个列的名称与属性的名称相同。但是,在这种方法中,您需要确保您的属性名称和数据类型列名称相同。

【讨论】:

    【解决方案2】:

    我不知道这是否符合您的确切要求 但您可以修改代码并将其用于动态生成 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;
                }
            }
        }
    
    }
    

    【讨论】:

    • 这里的表名是指你在DB中创建的类型
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多