2017-03-24 10 views
0

エンタープライズライブラリ(バージョン= 6.0.0.0)を使用してVS2015 MVCプロジェクトで作業しています。私はSQLストアドプロシージャにパラメータとしてクラス型の配列を送信する必要があります。Microsoft.Practices.EnterpriseLibraryを使用してクラス型配列をSQLサーバーデータベースに渡す方法

public static Database CoreDB 
    { 
     get 
     { 
      return _coreDatabase; 
     } 
    } 

    public BaseRepository() 
    { 
     DatabaseProviderFactory factory = new DatabaseProviderFactory(); 
     Database coreDB = factory.Create("DB_Name"); 
     _coreDatabase = coreDB; 
    } 

ビューモデルでは、データベースに挿入するIDのコレクションを含むクラスabcの配列を作成しました。

public class viewModelClass 
{ 
    public abc[] Details { get; set; } 
    public int param1 { get; set; } 
    public int param2 { get; set; } 
    public int param3 { get; set; } 
} 

public class abc 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public Boolean IsActive { get; set; } 

} 

POST後、ストアドプロシージャにモデルから値を渡すAM(私はこの配列パラメータを処理するためのSQLサーバでのユーザ定義テーブル型を作成しています)。

public int CreateAdminUser(viewModelClass userInfo) 
    { 
     string insertUserSP = Resources.InsertUser; 
     DbCommand cmd = CoreDB.GetStoredProcCommand(insertUserSP); 
     CoreDB.AddInParameter(cmd, "@param1", DbType.Int32, userInfo.param1); 
     CoreDB.AddInParameter(cmd, "@param2", DbType.Int32, userInfo.param2); 
     CoreDB.AddInParameter(cmd, "@param3", DbType.Int32, userInfo.param3); 

     SqlParameter temp = new SqlParameter("@details", userInfo.Details); 
     temp.SqlDbType = SqlDbType.Structured; 
     temp.TypeName = "dbo.UserDefinedTypeName"; 
     cmd.Parameters.Add(temp); 

     int result = Convert.ToInt32(CoreDB.ExecuteNonQuery(cmd)); 
     return result; 
    } 

「[] IEnumerable'1にABCからパラメータ値を変換できませんでした」とは、ExecuteNonQuery()の実行中に「オブジェクトがIConvertibleを実装する必要があります」と内部例外として例外を取得します。

私の問題は、このUserInfo.Details配列をパラメータとしてSQL Serverに渡すことです。

これは、あなたがテーブル型のパラメータにクラスオブジェクトの配列を渡すことはできません、私のテーブル型...

CREATE TYPE [dbo].[UserDefinedTypeName] AS TABLE( 
    [Id] [int] NOT NULL, 
    [Name] [varchar](200) NULL, 
    [IsActive] [bit] NULL) 
+0

あなたは 'userInfo.param1'-' userInfo.param3'のタイプを見逃しました。また、 'userInfo.abc'は存在しません(あなたが詳細を意味すると思います)。そのストアドプロシージャの署名は何ですか? –

+0

実際には、public class viewModelClass { 公開abc []詳細{get;セット; } パブリックint param1 {get;セット; } 公開ストリングparam2 {get;セット; } public int param3 {get;セット; } }とSqlParameterのtemp =新しいSqlParameter( "@詳細"、userInfo.Details);私の問題は、このUserInfo.Details配列をSQLサーバーへのパラメータとして渡すことです –

+0

これは私のテーブルタイプです... CREATE TYPE [dbo]。[UserDefinedTypeName] AS TABLE( \t [Id] [int] NOT NULL、 \t [名前] [varchar](200)NULL、 \t [IsActive] [bit] NULL ) –

答えて

1

です。 dataTableを作成し、それに渡すデータを入力する必要があります。

以下を考慮してください。

public int CreateAdminUser(viewModelClass userInfo) 
{ 
    //Creating table with the same structure as defined table type in SQL Server 
    var table = new DataTable(); 
    var dataColumn = new DataColumn("Id", typeof(int)); 
    table.Columns.Add(dataColumn); 

    dataColumn = new DataColumn("Name", typeof(string)); 
    table.Columns.Add(dataColumn); 

    dataColumn = new DataColumn("IsActive", typeof(bool)); 
    table.Columns.Add(dataColumn); 

    // Populating table from the userInfo.Details array 
    foreach (var item in userInfo.Details) 
    { 
     var row = table.NewRow(); 

     row["Id"] = item.ID; 
     row["Name"] = item.Name; 
     row["IsActive"] = item.IsActive; 

     table.Rows.Add(row); 
    } 

    string insertUserSP = Resources.InsertUser; 
    DbCommand cmd = CoreDB.GetStoredProcCommand(insertUserSP); 
    CoreDB.AddInParameter(cmd, "@param1", DbType.Int32, userInfo.param1); 
    CoreDB.AddInParameter(cmd, "@param2", DbType.Int32, userInfo.param2); 
    CoreDB.AddInParameter(cmd, "@param3", DbType.Int32, userInfo.param3); 

    SqlParameter temp = new SqlParameter("@details", SqlDbType.Structured); 
    temp.TypeName = "dbo.UserDefinedTypeName"; 
    temp.Value = table; 
    cmd.Parameters.Add(temp); 

    int result = Convert.ToInt32(CoreDB.ExecuteNonQuery(cmd)); 
    return result; 
} 

これで問題が解決するはずです。

+0

はい、それは働いた!どうもありがとうございます –

関連する問題