3

我正在分析和制作 Windows 服务应用程序。

当我进行插入查询时,我使用添加列List<SqlParameter>和 AddRange 添加列。

在行中List<SqlParameter> pmlist = new List<SqlParameter>(keys);,它包含 {@DeptCode}。

然后pmlist.AddRange(pms);行,pms参数添加。

Bus 我之前提到的 pmslist 已经有了{@DeptCode},所以 pmlist 有这样的值

 pmlist = [0] {@DeptCode} [1] {@DeptCode} [2] {@DeptName}  
 [3] {@ParentDeptName} [4] {@ParentDeptCode} [5] {@DeptLevel}

DeptCode 重复。因此,它尝试向 ShadowDeptTable 插入查询,

它也有 5 列,发生了 Sql 异常。

如何删除或不获取重复值?请帮我...

代码如下。

//table : ShadowDeptTable ,  keys = {@DeptCode}, 
//pms =   [0] {@DeptCode} [1] {@DeptName} [2] {@ParentDeptName}  
//        [3] {@ParentDeptCode} [4] {@DeptLevel}    

public static int InsertOrUpdate(string table, SqlParameter[] keys, params SqlParameter[] pms)
{
   int st = 0;
   string constr = Util.GetPropVal(Words.PropConnectionString);
   var obj = SqlHelper.ExecuteScalar(constr,CommandType.Text,sb.ToString(),keys);
   StringBuilder sb=new StringBuilder();
   sb = sb.Append("insert into " + table + "(");
   //columns
   string cols = null;
   //values
   string vals = null;
   List<SqlParameter> pmlist = new List<SqlParameter>(keys);
   pmlist.AddRange(pms);
   cols = string.Join(",", pmlist.Select(a => "["+a.ParameterName.Substring(1, a.ParameterName.Length-1)+"]"));
   vals = string.Join(",", pmlist.Select(a => "'" + a.Value + "'"));
   sb = sb.Append(cols);
   sb = sb.Append(") values(");
   sb = sb.Append(vals);
   sb = sb.Append(")");
   obj = SqlHelper.ExecuteScalar(constr, CommandType.Text, sb.ToString());
   return Convert.ToInt32(obj);
}
4

2 回答 2

3

我没有深入研究您的代码。假设我们只是在谈论删除重复项。

如果您想按参数名称删除重复项,您可以尝试以下操作:

var merged = keys.Union(pms).GroupBy(p => p.ParameterName).Select(e => e.First());

它将合并两个数组,按参数名称分组,然后从每个组中选择第一项。

于 2017-02-17T03:20:11.773 回答
0

尝试使用除外

List<SqlParameter> newPms = pms.Except(pmlist).ToList();
pmlist.AddRange(newPms);
于 2017-02-17T03:45:09.627 回答