【问题标题】:Use DatabaseFactory to call Stored Procedure by passing TableType使用 DatabaseFactory 通过传递 TableType 来调用存储过程
【发布时间】:2015-06-02 14:15:10
【问题描述】:

尝试将表类型传递给存储过程时出现错误

使用数据类型名称创建数据表 dataTableMyData

DataTable dataTableMyData = new DataTable("myTableType");

我的代码:

 DatabaseFactory.ClearDatabaseProviderFactory();
 DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory());
 Database db = DatabaseFactory.CreateDatabase();
 DataSet dsResult = new DataSet();
  DbCommand cmd = db.GetStoredProcCommand("sp_Save_Clue_Auto_Response"))
  db.AddInParameter(cmd, "@myTableType", System.Data.SqlDbType.Structured, dataTableMyData);

如何使用DatabaseFactory 来传递表类型。请在这里帮助我。

【问题讨论】:

    标签: sql-server-2008 c#-4.0 ado.net


    【解决方案1】:

    您的代码不执行命令?您忘记在示例中发布了吗?

    DataTable table = new DataTable();
    SqlDatabase database = (SqlDatabase) DatabaseFactory.CreateDatabase("DatabaseName");
    DbCommand dbCommand = database.GetStoredProcCommand("[StoredProcName]");
    database.AddInParameter(dbCommand, "@MyTvp",SqlDbType.Structured, table);
    DataSet dataSet = database.ExecuteDataSet(dbCommand);
    

    【讨论】:

      【解决方案2】:

      也许不是最好的方法,但有效:

      -- Create the data type
      CREATE TYPE dbo.PlantList AS TABLE 
      (
          plant_code char(1) Not Null Primary Key
      )
      GO
      

      扩展方法

      public static class DatabaseExtensions
      {
          public static void AddTableTypeParameter<T>(this Database database, DbCommand command, string name, string sqlType, IEnumerable<T> values)
          {
              var table = new DataTable();
              PropertyInfo[] members = values.First().GetType().GetProperties();
              foreach (var member in members)
              {
                  table.Columns.Add(member.Name, member.PropertyType);
              }
      
              foreach (var value in values)
              {
                  var row = table.NewRow();
                  row.ItemArray = members.Select(m => m.GetValue(value)).ToArray();
                  table.Rows.Add(row); 
              }
              var parameter = new SqlParameter(name, SqlDbType.Structured)
              {
                  TypeName = sqlType,
                  SqlValue = table
              };
              command.Parameters.Add(parameter);
          }
      
      }
      

      并调用如下:

      database.AddTableTypeParameter(command, "@region_filter_plants", "dbo.PlantList", regionFilterPlants.Select(p => new { plant_code = p }));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 2011-03-13
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多