我想将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];
}
}