예제 #1
0
        static void Main(string[] args)
        {
            bool debug = Properties.Settings.Default.Verbose;
            
            U2Conn srcConn = new U2Conn();
            SqlConn destConn = new SqlConn();
            
            srcConn.Host = Properties.Settings.Default.U2Host; // "pmsteel.kwyk.net";
            srcConn.Login = Properties.Settings.Default.U2Login; // "administrator";
            srcConn.Password = Properties.Settings.Default.U2Password; // "H!carb0n";
            srcConn.Catalog = Properties.Settings.Default.U2Account; // "C:\\BAI.PROD\\PM";

            destConn.Host = Properties.Settings.Default.SqlHost; // "pmsteel.kwyk.net";
            destConn.Login = Properties.Settings.Default.SqlLogin; // "pmsteel";
            destConn.Password = Properties.Settings.Default.SqlPassword; // "H!carb0n";
            destConn.Catalog = Properties.Settings.Default.SqlDatabase; // "pmsteel"

            /*
            try
            {
                srcConn.Connect();
                destConn.Connect();
                srcConn.Disconnect();
                destConn.Disconnect();
            }
            catch (Exception e)
            {
                debugPrint(true, "Error: " + e);
            }
            */

            String sqlStmt = "";
            
            try
            {
                // every thing runs out of the UniSession instance.
                UniSession uSession = null;

                //Set up variables.
                uSession = UniObjects.OpenSession(Properties.Settings.Default.U2Host, Properties.Settings.Default.U2Login, 
                                                  Properties.Settings.Default.U2Password, Properties.Settings.Default.U2Account);
                
                debugPrint(debug, "U2 openSession succeeded\n");

                debugPrint(debug, "Status = " + uSession.Status + "\n");

                //Class.forName("net.sourceforge.jtds.jdbc.Driver");
                //Connection conn = DriverManager.getConnection(sqlJdbcUrl, sqlUser, sqlPass);
                //debugPrint(debug, "SQL Server connection succeeded");
                //Statement stmt = conn.createStatement();

                UniFile uf = uSession.CreateUniFile(Properties.Settings.Default.U2File);
                debugPrint(debug, Properties.Settings.Default.U2File + " file opened\n");
                //debugPrint(debug, uf.ToString());

                UniSelectList usl = uSession.CreateUniSelectList(8);

                StreamWriter sw = new StreamWriter(@"c:\temp\u2rl.xml");
                        
                usl.Select(uf);
                while (!usl.LastRecordRead)
                {
                    String key = usl.Next();
                    debugPrint(debug, "key: " + key + "\n");
                    if (key != "")
                    {
                        XElement xd = new XElement("data");
                        XElement xd2 = new XElement("data");
                        UniDynArray udaRow = uf.Read(key);
                        int v2 = 0;
                        int s2 = 1;
                        while (s2 > 0)
                        {
                            XElement xv2 = new XElement("val", new XAttribute("loc", s2));
                            s2 = 0;
                            for (int f2 = 1; f2 <= udaRow.Dcount(); f2++)
                            {
                                if ( s2 <= udaRow.Dcount(f, v))
                                {
                                XElement xf2 = new XElement("fld", new XAttribute("loc", f2));
                                string fld = udaRow.Extract(f2, v2).ToString();
                                if ("" != fld)
                                {
                                }
                            }
                        }
                        for (int f = 1; f <= udaRow.Dcount(); f++)
                        {
                            XElement xf = new XElement("fld", new XAttribute("loc", f));
                            string fld = udaRow.Extract(f).ToString();
                            if ("" != fld)
                            {
                                for (int v = 1; v <= udaRow.Dcount(f); v++)
                                {
                                    XElement xv = new XElement("val", new XAttribute("loc", v));
                                    string val = udaRow.Extract(f, v).ToString();
                                    if ("" != val)
                                    {
                                        for (int s = 1; s <= udaRow.Dcount(f, v); s++)
                                        {
                                            xv.Add(new XElement("sub", new XAttribute("loc", s), udaRow.Extract(f, v, s).ToString()));
                                        }
                                    }
                                    xf.Add(xv);
                                }
                            }
                            xd.Add(xf);
                        }
                        XElement xr = new XElement("row", new XElement("id", key), xd);
                        sqlStmt = "INSERT INVF(u2_id, u2_data) VALUES ('" + key.Replace("'", "''") + "', '" + xd.ToString().Replace("'", "''") + "')";
                        sw.WriteLine(xr);
                    }
                }
                sw.Close();

                //UniDynArray udaRow = uSession.CreateUniDynArray(usl.Next());
                //debugPrint(debug, usl.readList().ToString());
                //while (!usl.IsLastRecordRead)
                //while (null != udaRow)
                //{
                    //String usKey = udaRow.Extract(1).ToString();
                    //Properties.Settings.Default.SqlTable = usKey;
                    //debugPrint(debug, "key: " + usKey + "\n");
                    //debugPrint(debug, usKey.ToString() + ": " + Properties.Settings.Default.SqlTable);
                    //sqlStmt = "IF EXISTS (SELECT * FROM sys.tables WHERE OBJECT_ID('dbo.[" + Properties.Settings.Default.SqlTable + "]') IS NOT NULL) DROP TABLE dbo.[" + Properties.Settings.Default.SqlTable + "]";
                    //debugPrint(debug, sqlStmt);
                    //stmt.executeUpdate(sqlStmt);
                    //sqlStmt = "CREATE TABLE dbo.[" + Properties.Settings.Default.SqlTable + "] (ID varchar(255) NOT NULL,LOC smallint NOT NULL,SEQ smallint NOT NULL,VAL varchar(8000) NOT NULL)";
                    //debugPrint(debug, sqlStmt);
                    //stmt.executeUpdate(sqlStmt);

                    //{{ int valIdx = 1; int fldIdx = 1;
                    //for (int fldIdx = 1; fldIdx <= udaRow.Dcount(); fldIdx++)
                    //{
                    //    debugPrint(debug, "field: " + udaRow.Extract(fldIdx).ToString());
                    //    for (int valIdx = 1; valIdx <= udaRow.dcount(fldIdx); valIdx++)
                    //    {
                    //        UniString usValue = udaRow.extract(fldIdx, valIdx);
                    //        debugPrint(debug, usValue.ToString());
                    //    }
                    //}

                    //UniFile ufTblFile = uSession.open(usKey);
                    //debugPrint(debug, "file opened");
                    ////debugPrint(debug, usKey.ToString());

                    //UniSelectList uslTblList = uSession.selectList(2);

                    //uslTblList.select(ufTblFile);
                    //UniString usTblKey = uslTblList.next();
                    //int cnt = 0;

                    //while (!uslTblList.isLastRecordRead())
                    //{

                    //    if (cnt++ % 1000 == 0) debugPrint(debug, "rows: " + cnt);
                    //    //debugPrint(debug, usTblKey.ToString());
                    //    UniDynArray udaTblRow = new UniDynArray(ufTblFile.read(usTblKey));

                    //    for (int fldTblIdx = 1; fldTblIdx <= udaTblRow.dcount(); fldTblIdx++)
                    //    {
                    //        for (int valTblIdx = 1; valTblIdx <= udaTblRow.dcount(fldTblIdx); valTblIdx++)
                    //        {
                    //            UniString usTblValue = udaTblRow.extract(fldTblIdx, valTblIdx);
                    //            //debugPrint(debug, usTblValue.ToString());
                    //            sqlStmt = "INSERT [" + Properties.Settings.Default.SqlTable + "] VALUES ('" + usTblKey.ToString().replace("'", "''") + "', " + fldTblIdx + ", " + valTblIdx + ", '" + usTblValue.ToString().replace("'", "''") + "')";

                    //            //debugPrint(debug, sqlStmt);
                    //            //stmt.executeUpdate(sqlStmt);

                    //        }
                    //    }
                    //    usTblKey = uslTblList.next();
                    //}

                    //udaRow = uSession.CreateUniDynArray(usl.Next());
                //}
                /*
                udaKeys = usl.readList();
                //UniDynArray udaValues;
 
                sqlStmt = "TRUNCATE TABLE [" + Properties.Settings.Default.SqlTable + ']';
                debugPrint(debug, sqlStmt);
                stmt.executeUpdate(sqlStmt);
    	 

                for (int keyIdx = 1;keyIdx < udaKeys.count();keyIdx++) {
                    usKey = udaKeys.extract(keyIdx);
                    debugPrint(debug, usKey.ToString());
                    if (usKey.length() > 0) {
                        debugPrint(debug, udaKeys.count() + " " + usKey + usKey.length() + " " + keyIdx);
                        sqlStmt = "INSERT [" + Properties.Settings.Default.SqlTable + "] VALUES ('" + usKey + "', 0, 1, '" +  usKey + "')";
                        debugPrint(debug, sqlStmt);
                        stmt.executeUpdate(sqlStmt);
                        udaRow = new UniDynArray(uf.read(usKey));
                        for (int fldIdx = 1; fldIdx <= udaRow.dcount(); fldIdx++) {
                            //usField = udaRow.extract(fldIdx) ;
                            //udaValues = new UniDynArray(usField);
                            for (int valIdx = 1; valIdx <= udaRow.dcount(fldIdx); valIdx++) {
                                usValue = udaRow.extract(fldIdx, valIdx) ;
                                if (usValue.length() > 0) {
                                    //debugPrint(debug, fldIdx + " " + valIdx + " -->" + usValue + "<--");
		        		 
                                    sqlStmt = "INSERT [" + Properties.Settings.Default.SqlTable+ "] VALUES ('" + usKey + "', " + fldIdx + ", " + valIdx + ", '" +  usValue.ToString().replace("'", "''") + "')";
                                    debugPrint(debug, sqlStmt);
                                    stmt.executeUpdate(sqlStmt);
                                }
                            }
                        }
                    }
                    //debugPrint(debug, udaKeys.extract(keyIdx));
                }
                */
                uf.Close();
                debugPrint(debug, Properties.Settings.Default.U2File + " file closed\n");
                
                // did we connect?

                debugPrint(debug, "U2 Disconnected\n");
                //conn.close();
                //debugPrint(debug, "SQL Disconnected.");

            }
            catch (UniSessionException e)
            {
                debugPrint(debug, "Error: " + e);
            }
            catch (UniFileException e)
            {
                debugPrint(debug, "File Error: " + e);
            }
            catch (UniSelectListException e)
            {
                // TODO Auto-generated catch block
                debugPrint(debug, "File Error: " + e);
            }
            Console.ReadKey();
        }
예제 #2
0
        static void Main(string[] args)
        {
            _options = new Options(args);
            SqlBulkCopy bulkCopy = null;

            if (_options.Verbose)
            {
                Console.WriteLine(_options.ToString());
            }

            try
            {
                var srcConn = new U2Conn();
                srcConn.Connect(_options.U2Host, _options.U2Login, _options.U2Password, _options.U2Account);

                var connectString = string.Format("Server={0};User Id={1};Password={2};;Database={3};"
                                                  , _options.SqlHost     // "pmsteel.kwyk.net"
                                                  , _options.SqlLogin    // "pmsteel"
                                                  , _options.SqlPassword // "H!carb0n"
                                                  , _options.SqlDatabase // "pmsteel"
                                                  );
                var destConn = new SqlConnection(connectString);
                destConn.Open();

                bulkCopy = new SqlBulkCopy(destConn);

                if ("" != _options.SqlDictTable)
                {
                    var srcDictReader = srcConn.GetDictReader(_options.U2File);

                    SqlTableAction(destConn, _options.SqlTableAction, _options.SqlDictTable, "dictionary");

                    //using (var bulkCopy = new SqlBulkCopy(destConn))
                    bulkCopy = new SqlBulkCopy(destConn);
                    {
                        bulkCopy.DestinationTableName = _options.SqlDictTable;
                        bulkCopy.BatchSize            = 100;
                        bulkCopy.NotifyAfter          = 100;
                        bulkCopy.SqlRowsCopied       += OnSqlRowsCopied;
                        bulkCopy.WriteToServer(srcDictReader);
                    }
                    Console.WriteLine("Copied {0} dictionary records to {1}", srcDictReader.RecordsAffected, _options.SqlDictTable);
                }

                if ("" != _options.SqlTable)
                {
                    var srcReader = srcConn.GetReader(_options.U2File);
                    srcReader.Limit = _options.Limit;

                    SqlTableAction(destConn, _options.SqlTableAction, _options.SqlTable, _options.SqlTableFormat);

                    //  using (bulkCopy = new SqlBulkCopy(destConn))
                    bulkCopy = new SqlBulkCopy(destConn);
                    {
                        bulkCopy.DestinationTableName = _options.SqlTable;
                        bulkCopy.BatchSize            = 100;
                        bulkCopy.NotifyAfter          = 100;
                        bulkCopy.SqlRowsCopied       += OnSqlRowsCopied;
                        bulkCopy.WriteToServer(srcReader);
                    }
                    Console.WriteLine("Copied {0} data records to {1}", srcReader.RecordsAffected, _options.SqlTable);
                    srcReader.Close();
                }

                srcConn.Disconnect();
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("Received an invalid column length from the bcp client for colid") && bulkCopy != null)
                {
                    string pattern = @"\d+";
                    Match  match   = Regex.Match(ex.Message.ToString(), pattern);
                    var    index   = Convert.ToInt32(match.Value) - 1;

                    FieldInfo fi            = typeof(SqlBulkCopy).GetField("_sortedColumnMappings", BindingFlags.NonPublic | BindingFlags.Instance);
                    var       sortedColumns = fi.GetValue(bulkCopy);
                    var       items         = (Object[])sortedColumns.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sortedColumns);

                    FieldInfo itemdata = items[index].GetType().GetField("_metadata", BindingFlags.NonPublic | BindingFlags.Instance);
                    var       metadata = itemdata.GetValue(items[index]);

                    var column = metadata.GetType().GetField("column", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
                    var length = metadata.GetType().GetField("length", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
                    //throw new DataFormatException(String.Format("Column: {0} contains data with a length greater than: {1}", column, length));
                    Console.WriteLine(String.Format("Column: {0} contains data with a length greater than: {1}", column, length));
                }

                Console.WriteLine("Error: " + ex);

                // todo: remove this after debugging?
                if (_options.Verbose)
                {
                    Console.Write("\nPress any key to continue");
                    Console.ReadKey();
                }
            }
        }