【问题标题】:Does ORMLITE support Table Variable as stored procedure parameter?ORMLITE 是否支持表变量作为存储过程参数?
【发布时间】:2017-01-01 13:19:36
【问题描述】:
我正在为我的 DAL 使用服务堆栈 ORMLIte,到目前为止,它对于基本的 CRUDS 非常有用。但是,我确实有一种特殊情况,我必须使用表变量的参数类型调用存储过程。现在,我知道 ADO.NET 通过 c# 使用 DataTable 类型调用数据库来支持这一点。但是,我不知道 ORMLite 是否支持它,因为我在文档中没有看到任何示例,如果支持,是否有任何示例?
【问题讨论】:
标签:
c#
servicestack
ormlite-servicestack
【解决方案1】:
是的,这是一个示例函数,更新后可与 TVP 一起使用(最初使用 OrmLite T4 模板生成,然后我进行了修改),希望对您有所帮助。我正在传递一个 HashSet 以用于构建 DataTable 以作为 TVP 参数传递:
public static OrmLiteSPStatement CallMyStoredProcTVP(this IDbConnection db, HashSet<int> userids)
{
// need to create a datatable to pass as a parameter to your tvp SP
DataTable dataTableUserIds = new DataTable();
dataTableUserIds.Columns.Add("Value", typeof(Int32));
foreach (int id in userids)
{
DataRow ro = dataTableUserIds.NewRow();
ro[0] = id;
dataTableUserIds.Rows.Add(ro);
}
// create db command
var dbCmd = (DbCommand)OrmLiteConfig.ExecFilter.CreateCommand(db).ToDbCommand();
// set name of SP
dbCmd.CommandText = "MyStoredProcTVP";
dbCmd.CommandType = CommandType.StoredProcedure;
// add new parameter but I leave off the Type
dbCmd.Parameters.Add(CreateNewParameter(dbCmd, "UserIDs", dataTableUserIds, ParameterDirection.Input));
return new OrmLiteSPStatement(db, dbCmd);
}
private static DbParameter CreateNewParameter(DbCommand dbCommand, string paramName, object paramValue, ParameterDirection paramDirection)
{
DbParameter param = dbCommand.CreateParameter();
param.Direction = paramDirection;
param.ParameterName = paramName;
param.Value = paramValue;
return param;
}