【问题标题】:Passing a DataTable to a SP with ServiceStack ORMLite使用 ServiceStack ORMLite 将 DataTable 传递给 SP
【发布时间】:2013-11-13 12:02:46
【问题描述】:

我必须调用一个存储过程,但传递一个数据表(一个 iEnumerable)作为参数。

我的 SQL 服务器上的 SP 把这个参数设为:

@LIST_USERS dbo.LIST_USERINFO_TYPE READONLY

类型定义为:

CREATE TYPE [dbo].[LIST_USERINFO_TYPE] AS TABLE(
   [ID_USER] [int] NOT NULL,
   [ID_DATA] [int] NOT NULL,
   [HEADER_TXT] [varchar](100) NULL)

然后,在调用方我以这​​种方式创建参数:

list.Add(new UserInfoItem { IdUser = 401, IdData = 3, HeaderTxt = "" });
list.Add(new UserInfoItem { IdUser= 402, IdData= 2, HeaderTxt= "gotcha" });
list.Add(new UserInfoItem { IdUser= 403, IdData= 1, HeaderTxt= "pacific rim" });

dbConn.StoredProcedure(sp,
  new
    {
      LISTA_QUESTIONARIO = DomandeRisposteList
    });

当我启动该项目时,它实际上停止了 KeyNotFoundException 尝试

name.DbType = OrmLiteConfig.DialectProvider.GetColumnDbType(propertyInfo.PropertyType);

ServiceStackExtension.cs

我怎样才能做到这一点?

【问题讨论】:

    标签: c# servicestack ormlite-servicestack


    【解决方案1】:

    我使用简单的数据表自己找到了答案:

            DataTable dataTableTmp = new DataTable();
            dataTableTmp.Columns.Add("ID_USER", typeof(Int32));
            dataTableTmp.Columns.Add("ID_DATA", typeof(Int32));
            dataTableTmp.Columns.Add("HEADER_TXT", typeof(string));
    
    
            foreach (var r in DomandeRisposteList)
            {
                DataRow ro = dataTableTmp.NewRow();
                ro[0] = r.IdUser;
                ro[1] = r.IdData ;
                ro[2] = r.HeaderTxt ;
    
                dataTableTmp.Rows.Add(ro);
            }
    
            var dbConn = dbFactory.OpenDbConnection();
    
            var res = dbConn.Exec(dbCmd =>
            {
                dbCmd.CommandType = CommandType.StoredProcedure;
                dbCmd.Parameters.Add(new SqlParameter("@LISTA_QUESTIONARIO", dataTableTmp));
                dbCmd.CommandText = "IF_SP_QUESTIONARIO_INSERT_TEST";
                return dbCmd.ExecuteReader().ConvertToList<DomandeRisposteItem>(); 
            });
    
            return res;
    

    【讨论】:

      【解决方案2】:

      以 Pizzaboys 的回答为基础...看起来您不能在 ExecuteReader() 之后将 ConvertToList 与更新版本的 servicestack 一起使用

      我必须这样做:

      var res = dbConn.Exec(dbCmd =>
      {
          dbCmd.CommandType = CommandType.StoredProcedure;
          dbCmd.Parameters.Add(new SqlParameter("@LISTA_QUESTIONARIO", dataTableTmp));
          dbCmd.CommandText = "IF_SP_QUESTIONARIO_INSERT_TEST";
          rtnList = dbCmd.ConvertToList<DomandeRisposteItem>(); 
      });
      

      【讨论】:

        【解决方案3】:

        基于首先创建 DataTable 并填充的 PizzaBoy 回答。出于我的目的(没有返回记录),以下内容与 ServiceStack v4 一起使用。

                //var Db = DbFactory.OpenDbConnection(); // I already have Db as IDbConnection from 'RepositoryBase'
                using (var dbCmd = Db.OpenCommand())
                {
                    dbCmd.CommandType = CommandType.StoredProcedure;
                    dbCmd.CommandText = "dbo.StoredProcName";
                    dbCmd.Parameters.Add(new SqlParameter("@tvpName", dataTableTmp));
                    dbCmd.ExecuteNonQuery();
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多