Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 列属性“序号位置”无效[导入和导出向导-Visual FoxPro ProviderDescriptors.xml SSIS]_Sql_Sql Server_Ssis_Odbc_Visual Foxpro - Fatal编程技术网

Sql 列属性“序号位置”无效[导入和导出向导-Visual FoxPro ProviderDescriptors.xml SSIS]

Sql 列属性“序号位置”无效[导入和导出向导-Visual FoxPro ProviderDescriptors.xml SSIS],sql,sql-server,ssis,odbc,visual-foxpro,Sql,Sql Server,Ssis,Odbc,Visual Foxpro,我正在尝试将Visual FoxPro数据库同步到SQL Server数据库。 我正在使用SQL Server数据工具中的SQL Server导入和导出向导 当我单击“编辑映射”时。。。我首先遇到了4个相同问题的错误,然后在ProviderDescriptors.xml中更改了一些值,结果是: <dtm:ColumnSchemaAttributes NameColumnName = "COLUMN_NAME" OrdinalPositionColumnN

我正在尝试将Visual FoxPro数据库同步到SQL Server数据库。 我正在使用SQL Server数据工具中的SQL Server导入和导出向导

当我单击“编辑映射”时。。。我首先遇到了4个相同问题的错误,然后在ProviderDescriptors.xml中更改了一些值,结果是:

<dtm:ColumnSchemaAttributes
    NameColumnName = "COLUMN_NAME"
    OrdinalPositionColumnName="ORDINAL_POSITION"
    DataTypeColumnName = "TYPE_NAME"
    MaximumLengthColumnName = "LENGTH"
    NumericPrecisionColumnName = "PRECISION"
    NumericScaleColumnName = "SCALE"
    NullableColumnName="NULLABLE"
    NumberOfColumnRestrictions="4"
/>
现在唯一的错误是OrdinalPositionColumnName 错误:列属性序号位置无效

使用Visual FoxPro ODBC驱动程序时,OrdinalPositionColumnName要使用哪个值

谢谢你的帮助

以下是一个示例:

void Main()
{
    string sqlConnectionString = @"server=.\SQLExpress;Trusted_Connection=yes;Database=Test";
    // c:\MyDataFolder\myTable.dbf
    string dataPath = @"c:\MyDataFolder";
    string tableName = @"MyTable";

    Stopwatch sw = new Stopwatch(); // just for timing the sample run
    sw.Start();

    using (OleDbConnection cn = new OleDbConnection("Provider=VFPOLEDB;Data Source=" + dataPath))
    using (SqlConnection scn = new SqlConnection(sqlConnectionString))
    {
        OleDbCommand cmd = new OleDbCommand($"select * from {tableName}", cn);
        SqlBulkCopy sbc = new SqlBulkCopy(scn, SqlBulkCopyOptions.TableLock, null);

        // Needed if VFP-SQL Server tables' field count or names are different
        // ie: LName in VFP might be LastName in SQL server
        // or VFP might have 10 fields when SQL server 8
        // VFP column names on left, SQL server column names on right
        sbc.ColumnMappings.Add("Category", "[Category]");
        sbc.ColumnMappings.Add("Activity", "[Activity]");
        sbc.ColumnMappings.Add("PersonId", "[PersonId]");
        sbc.ColumnMappings.Add("FirstName", "[FirstName]");
        sbc.ColumnMappings.Add("MidName", "[MidName]");
        sbc.ColumnMappings.Add("LastName", "[LastName]");
        sbc.ColumnMappings.Add("Email", "[Email]");

        cn.Open();
        scn.Open();

        // Since this is a sample, instead of wrting to a table
        // creating and writing to a global temporary table
        // You can see this table's data, connecting to the same database (global temp)
        SqlCommand createTemp = new SqlCommand();
        createTemp.CommandText = @"create table ##PersonData 
  (
    [Id] int identity primary key,
    [Category] varchar(50), 
    [Activity] varchar(50) default 'NullOlmasin', 
    [PersonId] varchar(50), 
    [FirstName] varchar(50), 
    [MidName] varchar(50), 
    [LastName] varchar(50), 
    [Email] varchar(50)
  )";
        createTemp.Connection = scn;
        createTemp.ExecuteNonQuery();

        OleDbDataReader rdr = cmd.ExecuteReader();

        sbc.NotifyAfter = 100000;
        sbc.BatchSize = 1000;
        sbc.BulkCopyTimeout = 10000;
        sbc.DestinationTableName = "##PersonData";

        sbc.SqlRowsCopied += (sender, e) =>
          {
              Console.WriteLine("-- Copied {0} rows to {1}.[{2} milliseconds]",
          e.RowsCopied,
          ((SqlBulkCopy)sender).DestinationTableName,
          sw.ElapsedMilliseconds);
          };

        sbc.WriteToServer(rdr);

        if (!rdr.IsClosed) { rdr.Close(); }

        cn.Close();
        scn.Close();
    }
    sw.Stop();
    Console.WriteLine($"Done in {sw.ElapsedMilliseconds} milliseconds.");
}

版本6.x之后没有Foxpro ODBC驱动程序。请改用VFPOLEDB驱动程序。@CetinBasoz谢谢您的回复!我无法使用Microsoft OLE DB Provider for Visual FoxPro,因为当我选择它并点击属性时,它会崩溃……我从未将它用于SSIS。我总是用VFP或C,Go。。。您可以在链接服务器中尝试VFPOLEDB。顺便说一句,它是一个32位的驱动程序,低于64位就不能工作。我的MS SQl Server是64位的,所以可能无法工作。我如何编写C程序将FVP自由表数据库导入SQl Server?您可以使用SqlBulkCopy类。如果你愿意,我可以给你一个示例代码作为答案。