Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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#和sql更新列值_C#_Sql Server_Datatable_Compare - Fatal编程技术网

比较两行并使用c#和sql更新列值

比较两行并使用c#和sql更新列值,c#,sql-server,datatable,compare,C#,Sql Server,Datatable,Compare,我正在制作一个关于同步数据库数据的应用程序 我有一个源数据库和一个目标数据库(它是空的) 当应用程序运行时,它在目标数据库的表中创建相同的列,并另外添加一个UpdateYN列 然后将源数据库表中的数据插入目标数据库表中 这意味着除了UpdateYN列之外,两个表具有相同的数据 我已经在上面构建了一个代码。但现在我想这样做 当我更新源数据库的表列时,我只想只更新目标数据库表中的那一行 所以,在更新之前,需要比较两行,并检查值,但我不知道如何处理它 请给我一些关于这个的链接或者分享你的知识,谢谢 代

我正在制作一个关于同步数据库数据的应用程序

我有一个源数据库和一个目标数据库(它是空的)

当应用程序运行时,它在目标数据库的表中创建相同的列,并另外添加一个
UpdateYN

然后将源数据库表中的数据插入目标数据库表中

这意味着除了
UpdateYN
列之外,两个表具有相同的数据

我已经在上面构建了一个代码。但现在我想这样做

当我更新源数据库的表列时,我只想只更新目标数据库表中的那一行

所以,在更新之前,需要比较两行,并检查值,但我不知道如何处理它

请给我一些关于这个的链接或者分享你的知识,谢谢

代码如下

注意:源表列名不是固定值

DataTable DeptDt = null; 

// Get Source DB table
DeptDt = DataSetMaker.Instance.FromMsSql(SourceDBPath, SourceDBName, SourceDBLoginID, SourceDBLoginPass, SourceDBDeptTableName);

if (DeptDt != null)
{
    Tool.Log(LogKinds.DEPT, LogLevels.INFORMATION, SourceKind, "Starting Dept Sync");
    if (DeptDt.Rows.Count == 0)
    {
        Tool.Log(LogKinds.DEPT, LogLevels.WARNNING, SourceKind, "There`s no Dept Datas.");
    }
    else
    {
        // PK of Source Table
        string DeptPk = AppConfigHelper.GetAppString(Words.SourceDeptPKColumn);

        // add @ like @deptcode
        string DeptPkVar = Util.ColNameToVarName(DeptPk);

        // wrapped like [deptcode]
        DeptPk = Util.GetActualColName(DeptPk);
        List<string> ErrorPks = Tool.GetSyncErrorPks(LogKinds.DEPT, LogSections.SOURCE);

        foreach (DataRow row in DeptDt.Rows)
        {
            string pk = row[DeptPk] + "";

            if (IsOnlyErrorSync && !ErrorPks.Contains(pk))
            {
                continue;
            }

            try
            {
                List<SqlParameter> pms = new List<SqlParameter>();

                // Add all Source table's columns to pms
                foreach (DataColumn item in DeptDt.Columns)
                {
                    var sp = new SqlParameter("@" + item.ColumnName, row[item.ColumnName]);
                    pms.Add(sp);
                }

                // Update and insert rows to Target Table. method is below 
                // ShadowDeptTable is Target Table
                QueryHelper.InsertOrUpdateShadowTables(Words.ShadowDeptTable,
                    new SqlParameter[]{new SqlParameter(DeptPkVar,pk)}, pms.ToArray());
            }
            catch (Exception ex)
            {
                Tool.SetSyncError(pk, LogKinds.DEPT, LogSections.SOURCE, ex.ToString());
            }
        }

        if (IsOnlyErrorSync)
        {
            Tool.ClearSyncError(LogKinds.DEPT, LogSections.SOURCE);
        }

        Tool.Log(LogKinds.DEPT, LogLevels.INFORMATION, SourceKind,"Dept Sync completed.");
    }
}
else
{
    Tool.ErrorLog(LogKinds.DEPT, LogSections.SOURCE, SourceKind, " Dept sync was failed");
}

public static int InsertOrUpdateShadowTables(string table, SqlParameter[] keys, params SqlParameter[] pms)
{
    int st = 0;

    // Count Target tables rows by PK - To check that row is exist in Target Table
    StringBuilder sb = new StringBuilder(string.Format("select count(*) from {0} ", table));
    string where = string.Empty;

    if (keys.Length > 0)
    {
        where += " where ";
        var temp = keys.Select(a => "[" + a.ParameterName.Substring(1, a.ParameterName.Length - 1) + "]"
         + " = '" + a.Value + "'").ToArray();
        where += string.Join(" and ", temp);
    }

    sb = sb.Append(where);

    // get connection string of target table
    string constr = Util.GetPropVal(Words.PropConnectionString);

    // count target table's rows 
    var obj = SqlHelper.ExecuteScalar(constr, CommandType.Text, sb.ToString(), keys);
    int cnt = Convert.ToInt32(obj);
    sb = sb.Clear();

    // insert 
    sb = sb.Append("insert into " + table + "(");
    string cols = null;
    string vals = null;

    List<SqlParameter> pmlist = new List<SqlParameter>(keys);
    pmlist.AddRange(pms);

    var merged = keys.Union(pmlist).GroupBy(p => p.ParameterName).Select(e => e.First());
    cols = string.Join(",",
           merged.Select(a =>
          "[" + a.ParameterName.Substring(1, a.ParameterName.Length - 1) + "]"));
    vals = string.Join(",",
                merged.Select(a => "'" + a.Value + "'"));
    sb = sb.Append(cols);
    sb = sb.Append(") values(");
    sb = sb.Append(vals);
    sb = sb.Append(")");

    // Update rows(the row exists in Target table)
    if (cnt > 0)
    {
        sb = sb.Clear();
        sb = sb.Append("update " + table + " set ");
        sb = sb.Append(string.Join(",", pms.Select(a =>
              "[" + a.ParameterName.Substring(1, a.ParameterName.Length - 1) + "]" + " = "
                 + "'" + a.Value + "'")));
        sb = sb.Append(where);

        // Update query excutes here
        obj = SqlHelper.ExecuteScalar(constr, CommandType.Text, sb.ToString());

        // Set UpdateYN = U
        sb = sb.Clear();
        sb = sb.Append("update " + table + " set [UpdateYN] = 'U'");
        sb = sb.Append(where);

        obj = SqlHelper.ExecuteScalar(constr, CommandType.Text, sb.ToString());
    }
    // Insert rows
    else
    {
        // Insert query executes here
        obj = SqlHelper.ExecuteScalar(constr, CommandType.Text, sb.ToString());

        // set UpdateYN = I
        sb = sb.Clear();
        sb = sb.Append("update " + table + " set [UpdateYN] = 'I'");
        sb = sb.Append(where);
        obj = SqlHelper.ExecuteScalar(constr, CommandType.Text, sb.ToString());
    }

    return Convert.ToInt32(obj);
}
DataTable DeptDt=null;
//获取源数据库表
DeptDt=DataSetMaker.Instance.fromssql(SourceDBPath、SourceDBName、SourceDBLoginID、SourceDBLoginPass、sourcedbdeptablename);
if(DeptDt!=null)
{
工具日志(LogKinds.DEPT、LogLevels.INFORMATION、SourceKind,“启动部门同步”);
if(DeptDt.Rows.Count==0)
{
Log(LogKinds.DEPT、LogLevels.WARNNING、SourceKind,“没有DEPT数据”);
}
其他的
{
//源表的主键
string DeptPk=AppConfigHelper.GetAppString(Words.SourceDeptPKColumn);
//添加@like@deptcode
字符串DeptPkVar=Util.ColNameToVarName(DeptPk);
//像[deptcode]一样包装
DeptPk=Util.getActualName(DeptPk);
List ErrorPks=Tool.GetSyncErrorPks(loggends.DEPT,LogSections.SOURCE);
foreach(DeptDt.Rows中的数据行)
{
字符串pk=行[DeptPk]+“”;
if(IsOnlyErrorSync&!ErrorPks.Contains(pk))
{
继续;
}
尝试
{
List pms=新列表();
//将所有源表的列添加到pms
foreach(DeptDt.Columns中的DataColumn项)
{
var sp=new-SqlParameter(“@”+item.ColumnName,行[item.ColumnName]);
pms.Add(sp);
}
//更新并向目标表插入行。方法如下
//ShadowDeptTable是目标表
QueryHelper.InsertOrUpdateShadowTables(Words.ShadowDeptTable,
新的SqlParameter[]{newsqlparameter(DeptPkVar,pk)},pms.ToArray();
}
捕获(例外情况除外)
{
Tool.SetSyncError(pk,loggends.DEPT,LogSections.SOURCE,例如ToString());
}
}
if(IsOnlyErrorSync)
{
工具.ClearSyncError(LogKinds.DEPT、LogSections.SOURCE);
}
Tool.Log(LogKinds.DEPT、LogLevels.INFORMATION、SourceKind,“DEPT Sync completed.”);
}
}
其他的
{
Tool.ErrorLog(LogKinds.DEPT、LogSections.SOURCE、SourceKind,“DEPT同步失败”);
}
公共静态int InsertOrUpdateShadowTables(字符串表,SqlParameter[]键,params SqlParameter[]pms)
{
int st=0;
//按主键计数目标表行-检查目标表中是否存在行
StringBuilder sb=新的StringBuilder(string.Format(“从{0}中选择计数(*),表));
字符串,其中=string.Empty;
如果(keys.Length>0)
{
where+=“where”;
var temp=keys.Select(a=>“[”+a.ParameterName.Substring(1,a.ParameterName.Length-1)+“]
+“=”“+a.Value+”).ToArray();
其中+=string.Join(“and”,temp);
}
sb=sb.追加(其中);
//获取目标表的连接字符串
string constr=Util.GetPropVal(Words.PropConnectionString);
//计算目标表的行数
var obj=SqlHelper.ExecuteScalar(constr,CommandType.Text,sb.ToString(),keys);
int cnt=转换为32(obj);
sb=sb.Clear();
//插入
sb=sb.追加(“插入”+表格+”(“”);
字符串cols=null;
字符串VAL=null;
列表pmlist=新列表(键);
pmlist.AddRange(pms);
var merged=keys.Union(pmlist).GroupBy(p=>p.ParameterName).Select(e=>e.First());
cols=string.Join(“,”,
合并。选择(a=>
“[”+a.ParameterName.Substring(1,a.ParameterName.Length-1)+“]”);
VAL=string.Join(“,”,
合并。选择(a=>“'”+a.值+“”);
sb=sb.追加(cols);
sb=sb.附加(“)值(”);
sb=sb.追加(VAL);
sb=sb.追加(“)”;
//更新行(该行存在于目标表中)
如果(cnt>0)
{
sb=sb.Clear();
sb=sb.追加(“更新”+表格+“设置”);
sb=sb.Append(string.Join(“,”,pms.Select)(a=>
[“+a.ParameterName.Substring(1,a.ParameterName.Length-1)+”]“+”=”
+“““+a.值+”));
sb=sb.追加(其中);
//在此处更新查询excutes
obj=SqlHelper.ExecuteScalar(constr,CommandType.Text,sb.ToString());
//设置UpdateYN=U
sb=sb.Clear();
sb=sb.Append(“更新”+table+“设置[UpdateYN]=“U”);
sb=sb.追加(其中);
obj=SqlHelper.ExecuteScalar(constr,CommandType.Text,sb.ToString());
}
//插入行
其他的
{
//此处执行Insert查询
obj=SqlHelper.ExecuteScalar(constr,CommandType.Text,sb.ToString());
//set UpdateYN=I
sb=sb.Clear();
sb=sb.Append(“更新”+table+“设置[UpdateYN]=“I”);
sb=sb.追加(其中);
obj=SqlHelper.ExecuteScalar(constr,CommandType.Text,sb.ToString());
}
返回转换为32(obj);
}

您可以编写和构建数据库对象,也可以只编写C#?是的,或者创建一个存储过程。您可以先将数据加载到暂存表中,然后通过在暂存表和