我有一个填充数据的数据表对象,并希望将其保存到SQL-DB(我不想运行foreach循环来进行插入),我的代码如下:
var dt = new DataTable();
//
// ... data loading to table dt
//
string sql = @"
INSERT INTO TB_Book (
BookID,
BookName
) SELECT
BookID,
BookName
FROM
@DataTable";
conn.execute(sql, new { DataTable = dt.AsTableValuedParameter("DataTable") });
当页面执行时,它会抛出以下异常:
列,参数或变量@DataTable。 :找不到数据类型DataTable
如何改进我的代码才能使其正常工作?
答案 0 :(得分:2)
我还没有使用AsTableValuedParameter,但我确实使用在dappers GIT Repository中编写的单元测试来教自己任何小巧的东西。当我去那里调查你的问题时,我找到了以下内容:
看起来你想要使用AsTableValuedParameter()而不提供“DataTable”类型。
以下是StackExchange中的示例:
[Fact]
public void DataTableParameters()
{
try { connection.Execute("drop proc #DataTableParameters"); }
catch { }
try { connection.Execute("drop table #DataTableParameters"); }
catch { }
try { connection.Execute("drop type MyTVPType"); }
catch { }
connection.Execute("create type MyTVPType as table (id int)");
connection.Execute("create proc #DataTableParameters @ids MyTVPType readonly as select count(1) from @ids");
var table = new DataTable { Columns = { { "id", typeof(int) } }, Rows = { { 1 }, { 2 }, { 3 } } };
int count = connection.Query<int>("#DataTableParameters", new { ids = table.AsTableValuedParameter() }, commandType: CommandType.StoredProcedure).First();
count.IsEqualTo(3);
count = connection.Query<int>("select count(1) from @ids", new { ids = table.AsTableValuedParameter("MyTVPType") }).First();
count.IsEqualTo(3);
try
{
connection.Query<int>("select count(1) from @ids", new { ids = table.AsTableValuedParameter() }).First();
throw new InvalidOperationException();
}
catch (Exception ex)
{
ex.Message.Equals("The table type parameter 'ids' must have a valid type name.");
}
}