0

我正在尝试将数据从 Oracle 迁移到 SQL。

我已经创建了表名和字段名。

两者的类型和大小相同:例如

  • 在 Oracle 上Varchar2(11),在 SQL 上VARCHAR(11)
  • 在 Oracle 上Date,在 SQL 上datetime2(0)

在我的应用程序中,我正在使用SqlBulkCopy函数。但是我在提交日期时遇到了上述错误。

  private void Processing(string sPath)
    {
        string AppPath = Application.StartupPath.ToString();
        IniFile myIni = new IniFile(sPath);

        string allTable = myIni.IniReadValue("TABLENAME", "TABLE");
        string[] alltables = allTable.Split(',');

        foreach (var tableName in alltables)
        {
            string whereSqlQuery = string.Empty;
            string sOrderBySqlQuery = string.Empty;
            string sSQLSelect = string.Empty;
            string sRCount = string.Empty;

            whereSqlQuery = myIni.IniReadValue(tableName, "WHERE");
            TableName = tableName;
            sOrderBySqlQuery = myIni.IniReadValue(tableName, "ORDERBY");

            sSQLSelect = myIni.IniReadValue(tableName, "SQLSELECT");
            //sRCount = myIni.IniReadValue(tableName, "RCOUNT");

            if (radAuto.Checked == true)
                ConnectAndQuery(tableName, whereSqlQuery, sOrderBySqlQuery, sSQLSelect, sRCount);
            else
                ConnectAndQuery(tableName, whereSqlQuery, sOrderBySqlQuery);
        }
    }
private void ConnectAndQuery(string strTableName, string strWhere, string strOrderBy, string sSqlSelect, string sRcount)
        {
            Cursor.Current = Cursors.WaitCursor;
            string connectionString = GetConnectionString();
            // Using 
            OracleConnection connection = new OracleConnection();
            SqlConnection oConn = default(SqlConnection);            
            DataTable dtSQL = null;            
            DateTime dtLog = DateTime.Now;
            try
            {
                //Opening Oracle DB Connection
                connection.ConnectionString = connectionString;
                connection.Open();
            ShownLog(string.Format("Table = {0} ,  -- STARTING --", strTableName));
            ShownLog("Oracle Connection Opened, OK");
            OracleCommand command = connection.CreateCommand();
            if (!string.IsNullOrEmpty(strWhere))
                SqlQuery = "SELECT * FROM " + strTableName + " WHERE "+ strWhere;
            else
                SqlQuery = string.Format("SELECT * FROM {0} ", strTableName);

            if (!string.IsNullOrEmpty(strOrderBy))
                SqlQuery += " ORDER BY " + strOrderBy;


            command.CommandText = SqlQuery;
            System.DateTime startTime = System.DateTime.Now;
            ShownLog("Starting Date Time : " + startTime);                
            DataTable dtTotalInsertCount = new DataTable(strTableName);

            if (!string.IsNullOrEmpty(sRcount))
            {
                //OracleDataAdapter adpCount = new OracleDataAdapter(sRcount, connectionString);                    
                ////adpCount.FillSchema(dtTotalInsertCount, SchemaType.Source);
                //adpCount.Fill(dtTotalInsertCount);
            }
            OracleDataAdapter adapter = new OracleDataAdapter(SqlQuery, connectionString);
            DataTable dt = new DataTable(strTableName);                
            adapter.FillSchema(dt, SchemaType.Source);

            bool valid = true;
            bool bCheck = true;
            int count = 1000;
            int start = 0;

            string sLogQuery = SqlQuery.Replace("'", "");
            dtLog = DateTime.Now;
            //Insert to SQL Log Table
            Insert(strTableName, dtLog, sLogQuery);

            int iLogCount = 0;
            int iActualCount = 0;
            do
            {
                int iEnd = 0;                    
                adapter.Fill(start, count, dt);
                valid = dt.Rows.Count > 0 ? true : false;

                if (valid)
                {
                    iLogCount += dt.Rows.Count;
                    iEnd = start + dt.Rows.Count;
                    ShownLog("No of data Rows retrieved from Oracle, Count = " + dt.Rows.Count);                        

                    //Create the SQL Server Table 
                    oConn = new SqlConnection(txtDestinationConnString.Text);
                    oConn.Open();

                    ShownLog("SQL Connection Opened, OK");

                    if (string.IsNullOrEmpty(sSqlSelect))
                        bCheck = false;
                    if (bCheck)
                    {
                        ShownLog("Data Comparision Start : " + System.DateTime.Now);                            
                        //If SQL Select Statement has
                        if (!string.IsNullOrEmpty(sSqlSelect))
                        {
                            SqlCommand cmd = new SqlCommand();
                            cmd.CommandText = sSqlSelect;
                            cmd.Connection = oConn;
                            cmd.CommandType = CommandType.Text;
                            SqlDataReader reader = cmd.ExecuteReader();
                            dtSQL = new DataTable();
                            dtSQL.Load(reader);
                            cmd = null;
                            reader = null;

                            //Return record has more than 0
                            ShownLog("Start Duplicate Checking : " + System.DateTime.Now);                                
                            if (dtSQL.Rows.Count > 0)
                            {
                                foreach (DataRow dr in dtSQL.Rows)
                                {
                                    DataRow[] result;
                                    if (strTableName == "ITK_STAFF" || strTableName == "ITK_FLIGHT")
                                    {
                                        result = dt.Select("URNO='" + dr[0].ToString() + "'");                                            
                                    }
                                    else
                                        result = dt.Select("URNO=" + dr[0]);

                                    if (result.Length > 0)
                                    {
                                        foreach (var drRemove in result)
                                        {
                                            dt.Rows.Remove(drRemove);
                                        }
                                    }
                                }
                            }
                            ShownLog("End Duplicate Checking : " + System.DateTime.Now);                                
                        }
                        ShownLog("Actual No.s of records to insert : " + dt.Rows.Count);                            
                        if (dt.Rows.Count == count)
                            bCheck = false;
                        ShownLog("Data Comparision End : " + System.DateTime.Now);                            
                    }

                    if (valid)
                    {
                        ShownLog(System.DateTime.Now + " Copying " + strTableName + " From : " + start.ToString() + " To : " + iEnd);                            
                    }

                    start += count;
                    if (dt.Rows.Count > 0)
                    {
                        iActualCount += dt.Rows.Count;
                        CopyData(dt, oConn);
                        dt.Rows.Clear();
                    }

                    oConn.Close();
                    oConn = null;
                }
            } while (valid);

            System.DateTime endTime = System.DateTime.Now;
            ShownLog("Ending  DateTime: " + endTime);
            //msgOut("No of rows copied from oracle to SQL Server , Count = " + dt.Rows.Count);

            TimeSpan diffTime = endTime.Subtract(startTime);
            ShownLog(String.Format("Time Difference is  Days : {0},  Hours : {1},  Minites : {2}, seconds : {3} ,Milliseconds : {4}", diffTime.Days, diffTime.Hours, diffTime.Minutes, diffTime.Seconds, diffTime.Milliseconds));

            ShownLog(string.Format("Table = {0} ,  -- FINISHED --", strTableName));

            ShownLog(string.Empty);                             

            Update(iLogCount, iActualCount, strTableName, dtLog, sLogQuery, " ", true);

            Cursor.Current = Cursors.Default;
        }
        catch (Exception ex)
        {
            Cursor.Current = Cursors.Default;
            ShownLog(ex.ToString());
            ShownLog(string.Empty);
            Update(0, 0, strTableName, dtLog, "", ex.ToString(), false);
            ((IDisposable)connection).Dispose();
            if (oConn != null)
                oConn.Close();
            RadioButtonControl();
        }
        finally
        {
            Cursor.Current = Cursors.Default;
            ((IDisposable)connection).Dispose();
            if (oConn != null)
                oConn.Close();

            RadioButtonControl();
        }
    }

private void CopyData(DataTable sourceTable, SqlConnection destConnection)
    {
        // Using 
        SqlBulkCopy s = new SqlBulkCopy(destConnection);
        try
        {
            s.DestinationTableName = TableName;
            s.NotifyAfter = 10000;
            s.SqlRowsCopied += new SqlRowsCopiedEventHandler(s_SqlRowsCopied);

            s.WriteToServer(sourceTable);
            s.Close();
        }
        finally
        {
            ((IDisposable)s).Dispose();
        }
    }
4

0 回答 0