Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有更好的方法来改进我的添加记录方法?_C#_Linq_Ibm Midrange - Fatal编程技术网

C# 有没有更好的方法来改进我的添加记录方法?

C# 有没有更好的方法来改进我的添加记录方法?,c#,linq,ibm-midrange,C#,Linq,Ibm Midrange,我正在处理IBMi服务器上的数据。我用于从.NET连接的驱动程序无法执行LINQ或实体框架。我知道还有另一个驱动程序,但这是昂贵的,根据我在网上看到的一切,我还没有弄清楚这是否真的有效 因此,为了“绕过”这个限制,我将数据从服务器拉入一个数据表,然后立即将该数据放入一个更为LINQ友好的模型中 到目前为止,我使用的大多数表都没有太多的列,在这些列中,复制粘贴参数以使其正常工作很烦人。现在我有了一个包含大量列的文件 SELECT DDATE, DPERNO, DPIN, DCODE, DCODE2

我正在处理IBMi服务器上的数据。我用于从.NET连接的驱动程序无法执行LINQ或实体框架。我知道还有另一个驱动程序,但这是昂贵的,根据我在网上看到的一切,我还没有弄清楚这是否真的有效

因此,为了“绕过”这个限制,我将数据从服务器拉入一个数据表,然后立即将该数据放入一个更为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;
    }

除了复制粘贴/修改每个字段之外。有什么办法可以让这更容易些吗。可能是循环或其他什么?

使用DataAnnotations属性,然后使用反射使用单个方法构建查询

[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
  }
}
[表(“QMFILES.PBMASTP”)]
公共类qmfilespmastp
{
[列(“DDATE”)]
公共日期时间DueDate{get;set;}
}
公共bool AddRecord(T型)
{
var tlbInfo=System.Attribute
.GetCustomAttribute(类型为(T),
类型(CustomTableAttribute))
作为可定制属性;
var cols=typeof(T).GetProperties()
.Where(p=>p.GetCustomAttributes(typeof(ColumnAttribute)),
(对)
.Count()=1)
.Select(p=>p.GetCustomAttributes(typeof(ColumnAttribute)),
(对)
.First()作为列属性);
var colNames=cols.Select(c=>c.Name);
if(tblInfo!=null&&cols.Count()>0)
{
StringBuilder sb=新的StringBuilder();
某人附加(“插入”);
sb.追加(tlbInfo.名称);
sb.附加(“值”);
sb.Append(string.Join(“,@”,colNames.ToArray());
//等
}
}

这应该在上发布。我想这是一个灰色区域。如果应该移动它,请移动。这让我更加担心。在我看来,SQL注入的时机已经成熟。我只是要复制粘贴代码以使其正常工作。据我所知,所有值都是参数化的。我只是没有向您提供代码添加参数值。哦…我不是要替换查询,我是要替换参数。