• 将DBF文件导入Sqlserver数据库


    项目中的问题:用户选择N个dbf文件导入sql2005数据库,由于每年dbf表结构都在变化,所以在sql2005中根本就不存在,需要每年根据dbf的结构自动建表。(文章来自http://blog.csdn.net/whuyi/article/details/5990205)

    解决方法(摘抄自网络):     

         --方法一:

             select * into 要生成的SQL表名 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;DATABASE=c:/','select * from dbf表名.dbf')

         --方法二:

             select * into 要生成的SQL表名 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase III;HDR=NO;IMEX=2;DATABASE=c:/','select * from dbf表名.dbf')

         --方法三:

             select * into 要生成的SQL表名 from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:/','select * from dbf表名.DBF')

            --用前两种方法导入SQL SERVER后,源表再用VFP打开就不提示“不能存取文件”,说明语句执行后就把源表关闭了。不过也有不尽人意的地方,就是用前两种方法导入后,源表中的字符型字段导入后SQL表字段对应变成NVARCHAR了。

    --第三种方法有一个缺点:把DBF表导入SQL Server中后,马上用VISUAL FOXPRO打开DBF表,会提示“不能存取文件”,即这个表还被SQL打开着呢。可是过了1分钟左右,再打开DBF表就可以了,说明经过一段时间后查询分析器才把这个表关闭。

    可以直接将dbf文件导入sqlserver数据库,也可以先将dbf文件导入dataset,再将dataset的数据导入数据库。dbf文件导入dataset的具体实现方法如下:

    需要引入system.data.Odbc包

     public DataSet importDbfToDataSet(string FilePath, string tabname)
            {
                string strConnection = @"Dsn=Visual FoxPro Tables;sourcedb=" + FilePath.Substring(0, FilePath.LastIndexOf("//")) + ";sourcetype=DBF;exclusive=No;backgroundfetch=Yes;collate=Machine";
    
                //对于连接串,注意版本问题
    
                string strSelect = "SELECT * FROM  " + tabname;
                OdbcConnection thisConnection = new OdbcConnection(strConnection);
                thisConnection.Open();
               OdbcDataAdapter thisAdapter = new OdbcDataAdapter(strSelect, thisConnection);
                DataSet thisDataSet = new DataSet();
                try
                {
                    thisAdapter.Fill(thisDataSet);
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    thisConnection.Close();
                }
                return thisDataSet;
            }
    View Code

    下面的程序通过Timer定时器,设置定时将本地dbf文件直接存入数据库表,该dbf文件会定时被覆盖掉。

     class Connect
        {
            //定义连接字符串,连接对象,命令对象
            private String connectionstr;
            private SqlConnection connection;
            private SqlCommand command;
            private DataSet dataset;      
            public Connect()
            {
                connectionstr = "Server=192.168.88.59;Initial Catalog=Test; User ID=sa;Password=sasa;";
                connection = new SqlConnection(connectionstr);
                dataset = new DataSet();          
                command = connection.CreateCommand();
                connection.Open();
            }
            public void CreateTimer()
            {
                Timer timer = new Timer();
                timer.Enabled = true;
                timer.Interval = 60 * 1000;//设置一分钟
                timer.Elapsed+=new ElapsedEventHandler(timer_Elapsed);
            }
            void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                Connect c = new Connect();
                int minute = e.SignalTime.Minute;
                int iminute = 5;
                if(minute==iminute)//设置每个小时的第五分钟执行
                c.Insert();
            }
            private void Insert()
            {
                //string filepath = "C;//";
                //将dbf文件导入指定数据库的表
                string creattb = "select * into tablename from OPENROWSET('MSDASQL','driver=Microsoft visual foxpro driver; sourcedb=c://;SourceType=DBF','select * from RSZ1031.dbf')";
                SqlCommand mycommand = new SqlCommand(creattb, connection);
                mycommand.ExecuteNonQuery();
            }
        }

    1.无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "msdasql" 的数据源对象”;

             原因是安装sql2005数据库的系统中没有 VFPODBC驱动,到http://msdn.microsoft.com/en-us/vfoxpro/bb190233.aspx下载并安装

     2.SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问;

          原因是因为“功能的外围应用配置器”中没有“启用openrowset和opendatasource支持”,只需要打开“功能的外围应用配置器”设置一下就可以。

  • 相关阅读:
    Niagara技术文档汇总
    cPickle对python对象进行序列化,序列化到文件或内存
    html = data.decode('gbk').encode('utf-8')
    用200行Python代码“换脸”
    No module named cv2
    JAVA Calendar具体解释
    千万别用模板给的list.size()巨坑
    div仿checkbox表单样式美化及功能
    动态规划0—1背包问题
    拒绝乱码:做外贸系统,打印俄文快递单时,避免俄文乱码的方法
  • 原文地址:https://www.cnblogs.com/shootingstar/p/4962028.html
Copyright © 2020-2023  润新知