【发布时间】:2013-01-01 16:35:14
【问题描述】:
我正在尝试使用 c#、.net 2.0 和 SQLServer 2012 Express 将 DataTable 发送到存储过程。
这大概就是我正在做的事情:
//define the DataTable
var accountIdTable = new DataTable("[dbo].[TypeAccountIdTable]");
//define the column
var dataColumn = new DataColumn {ColumnName = "[ID]", DataType = typeof (Guid)};
//add column to dataTable
accountIdTable.Columns.Add(dataColumn);
//feed it with the unique contact ids
foreach (var uniqueId in uniqueIds)
{
accountIdTable.Rows.Add(uniqueId);
}
using (var sqlCmd = new SqlCommand())
{
//define command details
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.CommandText = "[dbo].[msp_Get_Many_Profiles]";
sqlCmd.Connection = dbConn; //an open database connection
//define parameter
var sqlParam = new SqlParameter();
sqlParam.ParameterName = "@tvp_account_id_list";
sqlParam.SqlDbType = SqlDbType.Structured;
sqlParam.Value = accountIdTable;
//add parameter to command
sqlCmd.Parameters.Add(sqlParam);
//execute procedure
rResult = sqlCmd.ExecuteReader();
//print results
while (rResult.Read())
{
PrintRowData(rResult);
}
}
然后我收到以下错误:
ArgumentOutOfRangeException: No mapping exists from SqlDbType Structured to a known DbType.
Parameter name: SqlDbType
经过进一步调查(在 MSDN、SO 和其他地方),似乎 .net 2.0 不支持将 DataTable 发送到数据库(缺少诸如 SqlParameter.TypeName 之类的东西),但我仍然不确定,因为我还没有看到有人明确声称 .net 2.0 中没有此功能
这是真的吗?
如果是这样,还有其他方法可以将数据集合发送到数据库吗?
提前致谢!
【问题讨论】:
-
我相信表值参数是在 SQL Server 2008 中添加的,因此它们可能在 .NET 2.0 中不可用。您能否改为发送 XML 并将其从存储过程解析为表变量?
-
@lc。 - 我可以,但这远非最佳。 :(
-
同意它远非最佳,我只是想跳出框框思考一下。在您的情况下,您似乎正在尝试发送一堆 GUID,并且由于它们的大小是固定的,您甚至可以将它们端到端地排列在 varbinary 中,然后将它们拆分回表变量中在过程中的一个循环中。对于更复杂的东西不是最佳选择,但它可能在这里工作。
标签: c# stored-procedures .net-2.0 sql-server-2012-express