我正在尝试使用petapoco将对象列表传递给存储过程,该消息返回一条消息,说明没有托管本机类型来映射我的对象类型,我不完全理解为什么以及如何纠正它。
我在我的数据库中使用Azure创建了一个Tabled-value参数
CREATE TYPE TransactionModel AS TABLE (
Id int,
UserName nvarchar(128),
RecordId int,
OrderId int,
Usd decimal(18,2),
Btc decimal(18,8),
BtcUsd decimal(18,2),
Fee decimal(18,2),
Type int,
DateTime datetime,
Updated datetime
)
我有一个与“交易”相匹配的表
My Sproc
ALTER PROCEDURE sp_SaveTransactions
-- Add the parameters for the stored procedure here
@Transactions TransactionModel READONLY,
@UserName nvarchar(128)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO Transactions(UserName, RecordId, OrderId, Usd, Btc, BtcUsd, Fee, Type, DateTime, Updated)
SELECT UserName, RecordId, OrderId, Usd, Btc, BtcUsd, Fee, Type, DateTime, Updated
FROM @Transactions
END
END
GO
最后是我的C#方法
public static void SpSave<T>(T obj, string userName)
{
try
{
var ctx = new PetaPoco.Database("MyDatabase");
if (obj.GetType().IsGenericType && obj is IEnumerable)
{
var list = (IList)obj;
var l = ctx.Query<List<TransactionModel>>(";EXEC sp_SaveTransactions @0", list, userName);
}
}
catch (Exception ex)
{
}
}
答案 0 :(得分:2)
MSDN中SQL Server的表变量支持的类型是数据表,DbDataReader或SqlDataRecord。 https://msdn.microsoft.com/en-us/library/bb675163%28v=vs.110%29.aspx
您应该能够简单地使用PetaPoco传递SqlParameter以及其中一种数据类型。
var param = new SqlParameter();
param.DbType = SqlDbType.Structured;
param.ParameterName = "@Transaction";
param.SqlValue = table; // Datatable or one of the acceptable SqlClient types above
ctx.Query<List<TransactionModel>>(";exec sp_SaveTransactions @0", param);