【问题标题】:SqlBulkCopy - empty datarows in db2tableSqlBulkCopy - db2table 中的空数据行
【发布时间】:2014-03-28 10:24:35
【问题描述】:

现在我终于将我的 csv 行(有点)写入表中。它确实添加了 7 行 csv,但没有数据。它唯一设置的是id,但无论如何它都是自动递增的。 csv 中的数据未到达表中。

 static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader, string csvSelection)
        {
            string header= isFirstRowHeader ? "Yes" : "No";

            string pathOnly = Path.GetDirectoryName(path);
            string fileName = Path.GetFileName(path);
            List<string> headerList = getHeader(fileName);
            string sql = @"SELECT " + "*" + " FROM [" + fileName + "]";
            //string sql = @"SELECT * FROM [" +  fileName  + "];";

            using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + ";Extended Properties=\"Text;HDR=" + headerList + ";FMT=Delimited(;)\""))
            using (OleDbCommand command = new OleDbCommand(sql, connection))
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
            {
                DataTable dataTable = new DataTable();
                dataTable.Locale = CultureInfo.CurrentCulture;
                foreach (var item in headerList)
                {
                    dataTable.Columns.Add(item);
                }

                adapter.Fill(dataTable);
                writeSchema(dataTable.Columns, pathOnly, fileName);
                return dataTable;
            }

        }

public static Boolean BatchBulkCopy(DataTable dt, string destTable, List<string> columnMapping, IBM.Data.DB2.DB2Connection connection, int batchSize)
        {
            DataTable dtInsertRows = dt;
            using (IBM.Data.DB2.DB2BulkCopy sbc = new IBM.Data.DB2.DB2BulkCopy(connection, IBM.Data.DB2.DB2BulkCopyOptions.TableLock))
            {
                sbc.DestinationTableName = "\"" + destTable + "\"";

                foreach (var mapping in columnMapping)
                {
                    var split = mapping.Split(new[] { ',' });
                    sbc.ColumnMappings.Add("\"" + split.First() + "\"", "\"" + split.Last() + "\"");
                }
                try{
                    sbc.WriteToServer(dtInsertRows);
                    sbc.Close();
                }
                catch(Exception e){
                    System.Console.WriteLine(e.ToString());
                }
            }
            connection.Close();
            return false;
        }
private static void writeSchema(DataColumnCollection columns, string csvDir, string csvFileName)
        {
            FileStream fsOutput =
                     new FileStream(csvDir + "\\schema.ini",
                                         FileMode.Create, FileAccess.Write);
            StreamWriter srOutput = new StreamWriter(fsOutput);

            srOutput.WriteLine("[" + csvFileName + "]");
            int i = 1;
            foreach (DataColumn item in columns)
            {
                srOutput.WriteLine("Col" + i + "=\"" + item.ToString() + "\" Text");
                i++;
            }
            srOutput.Close();
            fsOutput.Close();
        }

        private static List<string> getHeader(string fileName)
        {
            string fullpath = @ImportPath + "\\" + fileName;
            List<string> header = new List<string>();
            var reader = new StreamReader(File.OpenRead(fullpath));

            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(';');

                foreach (var spalte in values)
                {
                    header.Add(spalte);
                }
                reader.Close();
                return header;
            }
            return null;
        }

    }

【问题讨论】:

    标签: c# csv sqlbulkcopy


    【解决方案1】:

    我不确定您的 sbc.ColumnMappings。如果您的数据表没有反映您的 db2 表的结构,我认为它只是需要的。在我的代码中,我处理数据表以使其具有与 DB2 表相同的列数和顺序。我不使用 ColumnMappings。

    第二个:你的 sbc.DestinationTableName。我在这里使用了一个字符串,该字符串具有来自 DB2 的确切模式和表名。 DestinationTableName = "DB2-Schema.DB2-表名"

    【讨论】:

      【解决方案2】:

      DB2 在哪个版本上运行?从 9.7 版开始支持批量复制

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多