【问题标题】:C# bcp to SQL ServerC# bcp 到 SQL Server
【发布时间】:2013-12-10 16:07:15
【问题描述】:

我编写了一个 C# 控制台程序,它读取制表符分隔的文件并执行

bcp tblName + " in " + outputfilename + " -c -T -S servername\instancename 
       -U readonly -P readonly -F2";

第一列为EmpID,即int,第二列为EMPName,即Varchar2(100)EMPLOYER VARCHAR(200)

outputfilename 有时会出现错误,而数据输入人员忘记在第一列输入 empID 或有时在输入员工姓名时会转到下一行。

EMPID    EMPNAME     EMPLOYER
100      Ann Taylor  A Corporation
Brian Tao B Corporation
200      Cindy
Smith   C Corporation
400      Daryl John   "D Corporation

第一行是正确的。

第二行,因为没有EMPID,我想获取行号并将其记录为错误。

第 3 行,虽然 Smith 是 Cindy 的姓氏,但无法知道,因此只有 200 个 CIndy 被保存,但日志应该报告错误,因为 Smith 前面没有数字

第 4 行,缺少双引号,在日志文件中报告错误。

这个可以吗?

谢谢 先生

【问题讨论】:

    标签: c# sql-server bcp


    【解决方案1】:

    AFAIK,BCP 没有简单的方法可以做到这一点。 BCP 通常非常不能容忍输入文件的列/行格式的不规则性。

    由于您已经使用 C#,我的建议是考虑改用 SQLBulkCopy API。它几乎与 BCP 一样快,并且将所有输入文件的处理留给您的程序。最初它比 BCP 需要更多的工作,但是一旦你有了一个工作实例,它就为程序员提供了更多的灵活性和选项。

    这个 MSDN 线程有一个 sanka060707 的示例,说明如何从 c#http://social.msdn.microsoft.com/Forums/en-US/4929a0a8-0137-45f6-86e8-d11e220048c3/creating-a-new-table-in-sql-server-from-adonet-datatable?forum=adodotnetdataproviders 使用它(这是对问题的第五个回复)。这是它的副本(长)

    public class SqlTableCreator
    {
        #region Instance Variables
        private SqlConnection _connection;
        public SqlConnection Connection {
            get { return _connection; }
            set { _connection = value; }
        }
    
        private SqlTransaction _transaction;
        public SqlTransaction Transaction {
            get { return _transaction; }
            set { _transaction = value; }
        }
    
        private string _tableName;
        public string DestinationTableName {
            get { return _tableName; }
            set { _tableName = value; }
        }
        #endregion
    
        #region Constructor
        public SqlTableCreator() { }
        public SqlTableCreator(SqlConnection connection) : this(connection, null) { }
        public SqlTableCreator(SqlConnection connection, SqlTransaction transaction) {
            _connection = connection;
            _transaction = transaction;
        }
        #endregion
    
        #region Instance Methods
        public object Create(DataTable schema) {
            return Create(schema, null);
        }
        public object Create(DataTable schema, int numKeys) {
            int[] primaryKeys = new int[numKeys];
            for (int i = 0; i < numKeys; i++) {
                primaryKeysIdea = i;
            }
            return Create(schema, primaryKeys);
        }
        public object Create(DataTable schema, int[] primaryKeys) {
            string sql = GetCreateSQL(_tableName, schema, primaryKeys);
    
            SqlCommand cmd;
            if (_transaction != null && _transaction.Connection != null)
                cmd = new SqlCommand(sql, _connection, _transaction);
            else
                cmd = new SqlCommand(sql, _connection);
    
            return cmd.ExecuteNonQuery();
        }
    
        public object CreateFromDataTable(DataTable table) {
            string sql = GetCreateFromDataTableSQL(_tableName, table);
    
            SqlCommand cmd;
            if (_transaction != null && _transaction.Connection != null)
                cmd = new SqlCommand(sql, _connection, _transaction);
            else
                cmd = new SqlCommand(sql, _connection);
    
            return cmd.ExecuteNonQuery();
        }
        #endregion
    
        #region Static Methods
    
        public static string GetCreateSQL(string tableName, DataTable schema, int[] primaryKeys) {
            string sql = "CREATE TABLE " + tableName + " (\n";
    
            // columns
            foreach (DataRow column in schema.Rows) {
                if (!(schema.Columns.Contains("IsHidden") && (bool)column["IsHidden"]))
                    sql += column["ColumnName"].ToString() + " " + SQLGetType(column) + ",\n";
            }
            sql = sql.TrimEnd(new char[] { ',', '\n' }) + "\n";
    
            // primary keys
            string pk = "CONSTRAINT PK_" + tableName + " PRIMARY KEY CLUSTERED (";
            bool hasKeys = (primaryKeys != null && primaryKeys.Length > 0);
            if (hasKeys) {
                // user defined keys
                foreach (int key in primaryKeys) {
                    pk += schema.Rows[key]["ColumnName"].ToString() + ", ";
                }
            }
            else {
                // check schema for keys
                string keys = string.Join(", ", GetPrimaryKeys(schema));
                pk += keys;
                hasKeys = keys.Length > 0;
            }
            pk = pk.TrimEnd(new char[] { ',', ' ', '\n' }) + ")\n";
            if (hasKeys) sql += pk;
            sql += ")";
    
            return sql;
        }
    
        public static string GetCreateFromDataTableSQL(string tableName, DataTable table) {
            string sql = "CREATE TABLE [" + tableName + "] (\n";
            // columns
            foreach (DataColumn column in table.Columns) {
                sql += "[" + column.ColumnName + "] " + SQLGetType(column) + ",\n";
            }
            sql = sql.TrimEnd(new char[] { ',', '\n' }) + "\n";
            // primary keys
            if (table.PrimaryKey.Length > 0) {
                sql += "CONSTRAINT [PK_" + tableName + "] PRIMARY KEY CLUSTERED (";
                foreach (DataColumn column in table.PrimaryKey) {
                    sql += "[" + column.ColumnName + "],";
                }
                sql = sql.TrimEnd(new char[] { ',' }) + "))\n";
            }
    
            return sql;
        }
    
        public static string[] GetPrimaryKeys(DataTable schema) {
            List<string> keys = new List<string>();
    
            foreach (DataRow column in schema.Rows) {
                if (schema.Columns.Contains("IsKey") && (bool)column["IsKey"])
                    keys.Add(column["ColumnName"].ToString());
            }
    
            return keys.ToArray();
        }
    
        // Return T-SQL data type definition, based on schema definition for a column
        public static string SQLGetType(object type, int columnSize, int numericPrecision, int numericScale) {
            switch (type.ToString()) {
                case "System.String":
                    return "VARCHAR(" + ((columnSize == -1) ? 255 : columnSize) + ")";
    
                case "System.Decimal":
                    if (numericScale > 0)
                        return "REAL";
                    else if (numericPrecision > 10)
                        return "BIGINT";
                    else
                        return "INT";
    
                case "System.Double":
                case "System.Single":
                    return "REAL";
    
                case "System.Int64":
                    return "BIGINT";
    
                case "System.Int16":
                case "System.Int32":
                    return "INT";
    
                case "System.DateTime":
                    return "DATETIME";
    
                default:
                    throw new Exception(type.ToString() + " not implemented.");
            }
        }
    
        // Overload based on row from schema table
        public static string SQLGetType(DataRow schemaRow) {
            return SQLGetType(schemaRow["DataType"],
                                int.Parse(schemaRow["ColumnSize"].ToString()),
                                int.Parse(schemaRow["NumericPrecision"].ToString()),
                                int.Parse(schemaRow["NumericScale"].ToString()));
        }
        // Overload based on DataColumn from DataTable type
        public static string SQLGetType(DataColumn column) {
            return SQLGetType(column.DataType, column.MaxLength, 10, 2);
        }
        #endregion
    }
    

    【讨论】:

      【解决方案2】:

      您可以尝试在 C# 应用程序中预处理输入文件。逐行阅读,尝试解析,检测所有错误,报告它们并将结果输出到另一个文件,然后传递给bcp

      【讨论】:

      • 如何解析??我怎么写这些规则?这是我的问题
      • 好吧,用分隔符分割字符串,看看能不能解析第一列的ID。如果是,请检查第二个和第三个字符串 - 一切正常 - 将其写入输出。如果缺少第三个字符串,请检查下一行等...
      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多