无法启用约束。一或多个行包含违反非null,唯一或外键约束的值。 C#Windows表单

时间:2018-07-17 05:51:57

标签: c# sql-server firebird

我正在研究Firebird Server和SQL Server,以将数据库从Firebird数据库更新到SQL Server数据库。此更新是使用称为更新程序工具的工具完成的。我已使用C#Windows应用程序创建了此工具,该工具已成功运行。

此数据库包含财务数据。客户端提供了一个Firebird数据库备份文件,其中包含截至2016年的数据,并且该文件已成功更新数据库。

我已经在系统上成功还原了备份文件,因此我创建了一个安装文件并将其安装在客户端系统上,然后开始更新数据库。客户端具有最新数据,它正在工作并正在更新SQL数据库。

它正在更新一些表,然后出现错误“无法启用约束。一个或多个行包含违反非空,唯一或外键约束的值。” 并且操作被取消。

我需要的是,每当我遇到这种类型的错误时,我都想跳过或忽略该错误,其余部分应该更新数据库。我是如何创建更新工具的,

  1. 我创建了存储所有表列的数组。这样做是因为在SQL Server数据库中仅更新了Firebird数据库表列中的选定列。
  2. 每个表都包含2个主键列,我创建了两个数据库的比较,以查找SQL Server数据库中不存在的数据。比较的表行存储在DataTable中。
  3. 通过选择日期来完成更新。在更新程序工具中,我提供了一个datetimepicker,客户端可以选择日期并更新其数据库。客户端所做的操作意味着SQL Server数据库已更新到2015年,而客户端希望从2017年开始更新数据,这意味着客户端保留了2016年的数据,因此在数据库比较中,它将获得2017年以上的全部数据。这是基于此的链接我创建了比较方法Database Comparison
  4. 下面是我如何更新数据库的代码

    public void UpdateToDatabse(DataTable table, string selectQuery, ArrayList columnNames, string tableName)
    {
        string fbSelectStatementQuery;
        int insertedCount = 0;
        int notInsertedCount = 0;
        listBox1.Items.Add("Total Rows to update " + table.Rows.Count); 
        using (FbConnection fbconn = getFbConnection(textBox1.Text))
        {
            FbCommand fbcmd = new FbCommand();
            fbcmd.Connection = fbconn;
            for (int i = 0; i < table.Rows.Count; i++)
            {
                if (tableName == "COMPDATA" || tableName == "COMPMAS")
                {
                    fbSelectStatementQuery = @"" + selectQuery
                    + " Where \"" + table.Columns[0].ColumnName + "\"='" + table.Rows[i][0] + "'";
                    fbcmd.CommandText = fbSelectStatementQuery;
                }
                else if (tableName == "DLYPRICEBSE" || tableName == "DLYPRICENSE")
                {
                    fbSelectStatementQuery = @"" + selectQuery
                   + " Where \"" + table.Columns[0].ColumnName + "\"='" + table.Rows[i][0] + "' and \""
                   + table.Columns[1].ColumnName + "\"='" + Convert.ToDateTime(table.Rows[i][1]).ToShortDateString() + "' and \""
                   + table.Columns[2].ColumnName + "\"='" + table.Rows[i][2] + "' and \""
                   + table.Columns[3].ColumnName + "\"='" + table.Rows[i][3] + "' and \""
                   + table.Columns[4].ColumnName + "\"='" + table.Rows[i][4] + "' and \""
                   + table.Columns[5].ColumnName + "\"='" + table.Rows[i][5] + "' and \""
                   + table.Columns[6].ColumnName + "\"='" + table.Rows[i][6] + "' and \""
                   + table.Columns[7].ColumnName + "\"='" + table.Rows[i][7] + "' and \""
                   + table.Columns[8].ColumnName + "\"='" + table.Rows[i][8] + "' and \""
                   + table.Columns[9].ColumnName + "\"='" + table.Rows[i][9] + "' and \""
                   + table.Columns[10].ColumnName + "\"='" + table.Rows[i][10] + "' and \""
                   + table.Columns[11].ColumnName + "\"='" + table.Rows[i][11] + "' and \""
                   + table.Columns[12].ColumnName + "\"='" + table.Rows[i][12] + "' and \""
                   + table.Columns[13].ColumnName + "\"='" + table.Rows[i][13] + "' and \""
                   + table.Columns[14].ColumnName + "\"='" + table.Rows[i][14] + "' and \""
                   + table.Columns[15].ColumnName + "\"='" + table.Rows[i][15] + "'";
                    fbcmd.CommandText = fbSelectStatementQuery;
                }
                else if (tableName == "EQTYHIS")
                {
                    fbSelectStatementQuery = @"" + selectQuery
                    + " Where \"" + table.Columns[0].ColumnName + "\"='" + table.Rows[i][0] + "' and \""
                    + table.Columns[1].ColumnName + "\"='" + Convert.ToDateTime(table.Rows[i][1]).ToShortDateString() + "' ";
                    fbcmd.CommandText = fbSelectStatementQuery;
                }
                else
                {
                    fbSelectStatementQuery = @"" + selectQuery
                    + " Where \"" + table.Columns[0].ColumnName + "\"='" + table.Rows[i][0] + "' and \""
                    + table.Columns[1].ColumnName + "\"='" + table.Rows[i][1] + "' ";
                    fbcmd.CommandText = fbSelectStatementQuery;
                }
                using (FbDataReader fbreader = fbcmd.ExecuteReader())
                {
                    while (fbreader.Read())
                    {
                        string colValues = @"( ";
                        string columns = @"";
                        int j = 0;
                        while (j < columnNames.Count)
                        {
                            if (j < columnNames.Count - 1)
                            {
                                columns += "\"" + columnNames[j] + "\"" + ", ";
                                colValues += "'" + ((Object)fbreader[columnNames[j].ToString()]) + "', ";
                            }
                            else
                            {
                                columns += "\"" + columnNames[j] + "\"";
                                colValues += "'" + fbreader[columnNames[j].ToString()] + "' )";
                            }
                            j++;
                        }
    
                        string insertQuery = "INSERT INTO Data." + tableName + " (" + columns + ") VALUES " + colValues;
                        using (SqlConnection sqlconn = getSqlConncetion())
                        {
                            try
                            {
                                SqlCommand sqlcmd = new SqlCommand(insertQuery, sqlconn);
                                sqlcmd.ExecuteNonQuery();
                                sqlconn.Close();
                                insertedCount++;
                            }
                            catch (Exception ex)
                            {
                                notInsertedCount++;
                                //MessageBox.Show("Not Inserted-->" + ex.Message);
                                //listBox1.Items.Add(fbreader["CO_CODE"] + ex.Message);                  
                            }
                        }
                    }
                    fbreader.Close();
                }
            }
            listBox1.Items.Add(insertedCount + " Rows are Updated....");
            if (notInsertedCount > 0)
            {
                listBox1.Items.Add(notInsertedCount + " Rows are not Updated....");
                listBox1.Items.Add("....");
            }
            else
            {
                listBox1.Items.Add("....");
            }
            //MessageBox.Show(insertedCount + " Rows are Updated in IBDMaster table " + tableName);
            fbconn.Close();
        }
        return;
    }
    

首先,我想跳过或忽略我遇到的错误。

第二,数据库代码执行缓慢,是否有任何方法可以快速更新数据库。

0 个答案:

没有答案