将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("http://")) + ";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支持”,只需要打開“功能的外圍應用配置器”設置一下就可以。
總結
以上是生活随笔為你收集整理的将DBF文件导入Sqlserver数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FJUT3703 这还是一道数论题(二分
- 下一篇: clone的fork与pthread_c