2012-09-05 16 views
4

我有一个存储过程,它接受用户定义的表类型和默认值,用户定义的数据类型设置为空。 现在我传递一个dataTable与较少的列从存储过程从C#代码希望其余列的值将设置为null。如何在SQL Server中用户定义的表类型将所有列的默认值设置为空时将少列的DataTable传递给存储过程

但是我得到这个错误: 尝试传递一个表值参数与21列(s),其中相应的用户定义的表类型需要77列(s)。 这是代码

SqlConnection conn = new SqlConnection("server=****; database=***;integrated security=SSPI"); 
    DataSet dataset=new DataSet(); 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand("Insert");  
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Connection = conn; 
    SqlParameter para = new SqlParameter(); 
    para.ParameterName = "@TableVar"; 
    para.SqlDbType = SqlDbType.Structured; 
    //SqlParameter para=cmd.Parameters.AddWithValue("@TableVar",table); 
    para.Value = table; 
    cmd.Parameters.Add(para); 
    cmd.ExecuteNonQuery(); 
+0

我假设您需要传递完整的表并将77-21列的所有默认字段设置为'DBNull'。 –

+0

有没有其他选择,因为我想在这个表中插入evry隔日和每次我必须使用不同的列,所以添加空约50列不好听 –

+0

为什么不创建在C#表中77列,只是使用您需要的列,其余列将为空或空,而无需将它们手动设置为空。 –

回答

2

您可以使用SqlDataAdapter来创建一个DataTable匹配的表型架构:

DataTable table = new DataTable(); 

// Declare a variable of the desired table type to produce a result set with it's schema. 
SqlDataAdapter adapter = new SqlDataAdapter("DECLARE @tableType dbo.UserDefindTableType 
              SELECT * FROM @tableType", ConnectionString); 

// Sets the DataTable schema to match dbo.UserDefindTableType . 
adapter.FillSchema(table, SchemaType.Source); 

然后,您可以使用所有默认的列值来创建数据行,只是你所认识的列一下:

DataRow row = table.NewRow(); 

// Set know columns... 
row["ColumnName"] = new object(); 

// or check column exists, is expected type etc first 
if (table.Columns.Contains("ColumnName") 
    && table.Columns["ColumnName"].DataType == typeof(string)) { 
    row["ColumnName"] = "String"; 
} 

table.Rows.Add(row); 
1

我有同样的问题,我工作的解决方案是运行额外的SQL查询来获取列定义,然后填补的DataTable与缺少的列,这里是你的表类型列定义的SQL语句:

select c.name, t.name as type, c.max_length as length from sys.table_types tt 
inner join sys.columns c on c.object_id = tt.type_table_object_id 
inner join sys.types t on t.system_type_id = c.system_type_id 
where tt.name = @tabletypename 
order by c.column_id 

的C#代码将是一个有点乱,你必须返回类型(即VARCHAR,INT等)解析为SqlDbType枚举如果您希望该解决方案适用于所有表格值参数定义..

如果你没有对本地文件系统的写访问权限,我会认为像这样的东西可能已经被SQL Server引擎中的微软更好地解决,因为它是导入CSV文件的下一个最佳方式,但是我希望单个UDTT迎合所有的CSV文件,每次处理新的文件格式时都不必创建新的表格类型。反正..咆哮结束。

相关问题