在SQL Server 2012中导入DBF文件

时间:2017-02-20 11:54:59

标签: import sql-server-2012 dbf

我有200多个dbf文件具有不同的架构。我已经使用SSIS导入.dbf文件,但为了自动执行我想要使用OpenRowset的任务。 OpenRowSet适用于Excel文件,但不适用于.dbf。 我写了

    <div class="panel-body" style="height:300px">
      <map ng-transclude class='google-map' center='map.center' zoom="map.zoom">
          <marker ng-repeat="pos in tabledata" position="{{[pos.lat, pos.lng]}}"></marker>
      </map>
   </div> 

任何帮助将不胜感激。

我正在使用SQL Server 2012,Windows 8.1。

已安装Foxpro驱动程序,但是当使用DTS选择foxpro时,它会失败。

3 个答案:

答案 0 :(得分:2)

仅供参考 - 您可以使用FoxPro的SQL Server升迁向导自动将DBF上传到SQL Server。

使用此工具,您必须从FoxPro上传,并且必须将DBF附加到FoxPro DBC。

http://www.codemag.com/article/0703052

最新版本(如果可从VFPx网站获得。

答案 1 :(得分:0)

我曾经也必须这样做,并为导入编写了一些C#代码。

尝试一下:使用此行我在C#中打开连接

var con = new OdbcConnection("Driver={{Microsoft dBASE Driver (*.dbf)}};Dbq=C:\\SomePath;DriverID=277;");

可能,你可以从中得到一些东西。

一些C#代码

以下代码取自我的一个C#项目。我将其修改为中立,但我无法保证,这样做是正确的:

    public List<string> Ambus;
    public List<string> Tbls;
    public List<string> errList;
    public List<string> SQLs;

    private void btnImport_Click(object sender, EventArgs e) {
        SqlConnection sqlcon;
        SqlCommand sqlcmd;

            SQLs.Clear();
            Tbls.Clear();

            var con = new OdbcConnection("Driver={{Microsoft dBASE Driver (*.dbf)}};Dbq=C:\\SomePath;DriverID=277;");
            con.Open();

            var tbls = con.GetSchema(OdbcMetaDataCollectionNames.Tables);
            foreach (System.Data.DataRow r in tbls.Rows) {
                Tbls.Add(r["TABLE_NAME"].ToString());
            }

            DataTable cols = null;
            var sb = new StringBuilder();

            int i = 0;
            foreach (var tblnm in Tbls) {
                i++;

                sb.Clear();

                try {
                    cols = con.GetSchema(OdbcMetaDataCollectionNames.Columns, new string[] { null, null, tblnm, null });

                    sb.AppendFormat(" CREATE TABLE dbo.[{0}](TableName VARCHAR(100) NOT NULL ", tblnm);
                    int count = 0;
                    foreach (DataRow colrow in cols.Rows) {
                        var colInf = string.Format(" ,{0} {1} NULL", colrow["COLUMN_NAME"].ToString(), this.createDataType(colrow["TYPE_NAME"].ToString(), colrow["COLUMN_SIZE"].ToString(), colrow["DECIMAL_DIGITS"].ToString(), colrow["NUM_PREC_RADIX"].ToString()));
                        sb.Append(colInf);
                        count++;
                    }
                    sb.Append("); ");
                    SQLs.Add(sb.ToString());
                    sb.Clear();

                    var cmd = new OdbcCommand("SELECT * FROM [" + tblnm + "]", con);
                    var reader = cmd.ExecuteReader();

                    while (reader.Read()) {
                        var vals = createVals(cols, reader, tblnm);
                        string insStat = string.Format(" INSERT INTO dbo.[{0}] VALUES ('{0}',{1});", tblnm, vals);
                        SQLs.Add(insStat);
                    }
                }
                catch (Exception exo) {
                    errList.Add(string.Format("{0}:{1}", tblnm, exo.Message));
                }
            con.Close();

            sqlcon = new SqlConnection("Data Source=SomeSQLServer;Initial Catalog=master;User ID=sa;pwd=SomePwd");
            sqlcon.Open();
            sqlcmd = new SqlCommand("USE SomeTargetDB;", sqlcon);
            sqlcmd.ExecuteNonQuery();

            i = 0;
            foreach (string s in SQLs) {
                i++;
                //Progress-output: this.Text = string.Format("{0} von {1}", i, SQLs.Count);
                sqlcmd = new SqlCommand(s, sqlcon);
                sqlcmd.ExecuteNonQuery();
            }
            sqlcon.Close();
        }
    }

    private string createDataType(string typ, string size, string dec, string prec) {
        switch (typ.ToLower()) {
            case "char":
                return "NVARCHAR(" + size + ")";
            case "logical":
                return "BIT";
            case "numeric":
                dec = dec == string.Empty ? null : dec;
                prec = prec == string.Empty ? null : prec;
                int d = int.Parse(dec ?? "0");
                int p = int.Parse(prec ?? "0");
                if (d == 0 && p == 0)
                    return "INT";
                else if (d > 0 && p > 0)
                    return string.Format("DECIMAL({0},{1})", d, p);
                else if (d == 0 && p > 0)
                    return "FLOAT";
                else
                return null;
            case "date":
                return "DATETIME";
            default:
                return null;
        }
    }

    private string createVals(DataTable cols, OdbcDataReader reader, string tblnm) {
        var sb = new StringBuilder();
        sb.Append("'" + tblnm + "'");
        foreach (DataRow colrow in cols.Rows) {
            var val = string.Empty;
            try {
                val = reader[colrow["COLUMN_NAME"].ToString()].ToString();
            }
            catch { }
            if (val.Trim().Length == 0)
                val = "NULL";
            else {
                if (colrow["TYPE_NAME"].ToString().ToLower() == "char")
                    val = val.Replace("'", "''");
                if (colrow["TYPE_NAME"].ToString().ToLower() == "numeric")
                    val = val.Replace(".", "").Replace(",", ".");
                if (colrow["TYPE_NAME"].ToString().ToLower() == "date") {
                    var d = DateTime.Parse(val, System.Globalization.CultureInfo.CurrentCulture);
                    if (d.Year < 1900 || d.Year > 2020)
                        d = new DateTime(1900, d.Month, d.Day, d.Hour, d.Minute, d.Second);
                    val = d.ToString("dd.MM.yyyy HH:mm:ss");
                }
                val = "'" + val + "'";
            }

            sb.AppendFormat(",{0}", val);
        }
        return sb.ToString();
    }

答案 2 :(得分:0)

最后,这是有效的

SELECT  * FROM OPENROWSET ('MICROSOFT.ACE.OLEDB.12.0','dBase 5.0;HDR=YES;IMEX=2;DATABASE=\Dbf Directory\',
'SELECT * FROM dbf_filename.dbf')