在SQL Server 2012中导入DBF文件

问题描述 投票:0回答:3

我有超过 200 个具有不同架构的 dbf 文件。我已经使用 SSIS 导入 .dbf 文件,但为了自动执行该任务,我想使用 OpenRowset。 OpenRowSet 对于 Excel 文件工作正常,但对于 .dbf 则不行。 我已经写了

SELECT [LRSNum],[AppUpdD],[AppStat],[PIN] FROM   OPENROWSET('MICROSOFT.ACE.OLEDB.12.0','dBASE 5.0;Database=D:\Sales-  data\SalesSourcefile\2016\December\Shape\Martin\real_land\', 'SELECT [LRSNum],[AppUpdD],[AppStat],[PIN] FROM real_land.dbf'); 

任何帮助将不胜感激。

我使用的是 SQL Server 2012、Windows 8.1。

安装了Foxpro驱动,但是使用DTS选择foxpro时失败。

import sql-server-2012 dbf
3个回答
3
投票

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

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

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

GitHub 上的 VFPX 提供最新版本:UpsizingWizard


1
投票

终于可以工作了

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

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();
    }
© www.soinside.com 2019 - 2024. All rights reserved.