0

IBM i サーバー上のデータを扱っています。.NET からの接続に使用しているドライバーは、LINQ または Entity Framework を実行できません。別のドライバーがあることは知っていますが、それは費用がかかり、オンラインで見たすべてに基づいて実際に機能するかどうかはまだわかりません.

したがって、この制限を "回避" するために、サーバーからデータ テーブルにデータを取得し、すぐにそのデータをより LINQ に適したモデルに配置します。

これまで私が扱ってきたほとんどのテーブルには、パラメーターをコピーして貼り付けて機能させるのが煩わしい列があまりありません。これで、大量の列を含むファイルができました。

SELECT DDATE, DPERNO, DPIN, DCODE, DCODE2, DESTCS, DBLDBP, DPERMP, DADFEE, DPRFEE, 
    DSURCR, DTTFEE, DSTNU, DSTEX, DSTNA, DSTSU, DDIR, DAPTS, DBORI, DSUBDV, DDIREC, 
    DSITED, DLEGAL, DAPPCD, DOWNER, DOWNAD, DONAD2, DOWNCT, DOWNST, DOWNZP, DOWPH1, 
    DOWCM1, DOWPH2, DOWCM2, DCMPNY, DCONTR, DCONAD, DCNAD2, DCONCT, DCONST, DCONZP, 
    DCNPH1, DCNCM1, DCNPH2, DCNCM2, DCNCPH, DCTRNO, DSPRCD, DTYCON, DTYCN2, DDEMO, 
    DZONE, DCOMDT, DSTRWD, DSTRDP, DSTYNO, DPROPT, DSETFR, DSETRR, DSETLF, DSETRT, 
    DATTGR, DUNAGR, DTYOCC, DSQFOT, DLOTCO, DPLMNM, DCONCD, DDIVIS, DARCHT, DENGIR, 
    DINSPC, DVARCE, DDTPD, DDTCOM, DUNITS, DVOID, DINSFL, DBLDCD, DCAUKY, DCAPIN  
  FROM MYTABLE

私は挿入を行う方法を書いていますが、もっと良い方法があるはずです。

    public bool AddBuildingPermit(BuildingPermit bp)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("INSERT INTO QMFILES.PBMASTP ");
        sb.Append("VALUES(@DDATE, @DPERNO, @DPIN, @DCODE, @DCODE2, @DESTCS, @DBLDBP, @DPERMP, @DADFEE, @DPRFEE, @DSURCR, @DTTFEE, @DSTNU, ");
        sb.Append("@DSTEX, @DSTNA, @DSTSU, @DDIR, @DAPTS, @DBORI, @DSUBDV, @DDIREC, @DSITED, @DLEGAL, @DAPPCD, @DOWNER, @DOWNAD, ");
        sb.Append("@DONAD2, @DOWNCT, @DOWNST, @DOWNZP, @DOWPH1, @DOWCM1, @DOWPH2, @DOWCM2, @DCMPNY, @DCONTR, @DCONAD, @DCNAD2, @DCONCT, ");
        sb.Append("@DCONST, @DCONZP, @DCNPH1, @DCNCM1, @DCNPH2, @DCNCM2, @DCNCPH, @DCTRNO, @DSPRCD, @DTYCON, @DTYCN2, @DDEMO, @DZONE, ");
        sb.Append("@DCOMDT, @DSTRWD, @DSTRDP, @DSTYNO, @DPROPT, @DSETFR, @DSETRR, @DSETLF, @DSETRT, @DATTGR, @DUNAGR, @DTYOCC, @DSQFOT, ");
        sb.Append("@DLOTCO, @DPLMNM, @DCONCD, @DDIVIS, @DARCHT, @DENGIR, @DINSPC, @DVARCE, @DDTPD, @DDTCOM, @DUNITS, @DVOID, @DINSFL, ");
        sb.Append("@DBLDCD, @DCAUKY, @DCAPIN)");

        using (iDB2Connection conn = new iDB2Connection(_connString))
        {
            using (iDB2Command cmd = new iDB2Command(sb.ToString(), conn))
            {
                cmd.Parameters.Add("@DDATE", iDB2DbType.iDB2Decimal).Value = IbmIDateTime.ConvertToNumericDate(bp.DateApplied);
                cmd.Parameters.Add("@DPERNO", iDB2DbType.iDB2Decimal).Value = GetNextBuildingPermitNumber();
                cmd.Parameters.Add("@DPIN", iDB2DbType.iDB2Char).Value = bp.CommonAddressPin;
                /// add all of the fields here
            }
        }
        return true;
    }

各フィールドのコピーと貼り付け/変更に加えて。これを簡単にする方法はありますか?もしかしてループか何か?

4

1 に答える 1

1

DataAnnotations 属性の TableAttributeColumnAttributeを使用してから、リフレクションを使用して単一のメソッドでクエリを作成します。

[Table("QMFILES.PBMASTP")]
public class QMFILESPBMASTP
{
    [Column("DDATE")]
    public DateTime DueDate { get; set; }
}

public bool AddRecord<T>(T model)
{
  var tlbInfo = System.Attribute
                      .GetCustomAttribute(typeof(T), 
                                          typeof(CustomTableAttribute)) 
                      as CustomTableAttribute;

  var cols = typeof(T).GetProperties()
                      .Where(p => p.GetCustomAttributes(typeof(ColumnAttribute),
                                                        true)
                                   .Count() == 1)
                      .Select(p => p.GetCustomAttributes(typeof(ColumnAttribute),
                                                         true)
                                    .First() as ColumnAttribute);
  var colNames = cols.Select(c => c.Name);


  if (tblInfo != null && cols.Count() > 0)
  {
    StringBuilder sb = new StringBuilder();
    sb.Append("INSERT INTO ");
    sb.Append(tlbInfo.Name);
    sb.Append("VALUES(@");
    sb.Append(string.Join(", @", colNames.ToArray()));

    // etc
  }
}
于 2012-07-12T20:57:58.910 に答える