SQL Server表值参数。类型是'对象'

时间:2018-05-24 11:51:04

标签: c# sql-server datatable

我想将DataTable作为参数传递给过程,这个DataTable源自Excel电子表格,然后转换为DataTable。

在SQL中,我创建了一个带有必填字段的类型表,所有列都与它接收的DataTable同名。在这个Excel电子表格中,某些字段可以为空,即空白..并且这些字段在我在SQL中创建的类型中被正确通知。

以下是我如何将DataTable传递给过程

的代码
    public void ImportToSql(DataTable dt)
{

        using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["AppConnectionString"].ConnectionString))
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = @"EXEC [dbo].AddPrextAndOperacoes @dataTable";
            cmd.CommandType = CommandType.StoredProcedure;               
            SqlParameter param = cmd.Parameters.AddWithValue("@dataTable", dt);
            param.SqlDbType = SqlDbType.Structured;

            var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
            returnParameter.Direction = ParameterDirection.ReturnValue;

            conn.Open();
            cmd.ExecuteNonQuery();
            var result = returnParameter.Value;
        }

}

问题是当它遇到第一个没有值的字段

时报告了以下错误
  

不支持“{field}”列的类型。类型是'对象'

在将dt作为参数传递给ImportToSql()之前,我检查是否有任何没有值的列并添加DBNull.Value,即使这样也会出现错误

foreach (DataColumn col in dataTable.Columns)
{
   foreach (DataRow row in dataTable.Rows)
   {
     row[col] = row[col]?.ToString() == "" ? DBNull.Value : row[col];
   }
}

0 个答案:

没有答案