我有一个人想尝试导入。DBF然后写入文件SQL手表。我遇到的问题是,如果我用的话SqlBulkCopy,它要求我提前创建表格,但这在我的情况下是不可能的,因为dbf文件不断变化。: u4 ~$ o! P2 B& u" c
到目前为止,这是我的代码:5 S( p- {! ~# x# Z
public void saveDBF() define the connections to the .dbf file OleDbConnection oConn = new OleDbConnection(@"rovider=Microsoft.Jet.OLEDB.4.0; Data Source=" Path.GetDirectoryName(tbFile.Text) ";Extended Properties=dBase III"); OleDbCommand command = new OleDbCommand("select * from " Path.GetFileName(tbFile.Text),oConn); open the connection and read in all the airport data from .dbf file into a datatable oConn.Open();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DataTable dt = new DataTable();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;dt.Load(command.ExecuteReader();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oConn.Close()close connection to the .dbf file create a reader for the datatable DataTableReader reader = dt.CreateDataReader();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;myConnection = new SqlConnection(cString); myConnection.Open()this is my connection to the sql server SqlBulkCopy sqlcpy = new SqlBulkCopy(myConnection); sqlcpy.DestinationTableName = "TestDBF"; //copy the datatable to the sql table sqlcpy.WriteToServer(dt); myConnection.Close();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;reader.Close();它总是无法sqlcpy.WriteToServer(dt);说明它无法访问目标表。. X5 a/ C8 d( o, \1 a" u& C
C#可以选择在写入表之前立即创建表吗? " b! V- s/ X; h$ G % Y3 o& [' F/ i6 K. ]% A+ T" t( A 解决方案: % \4 v( @) t2 `+ y+ L" h* Y
这种方法可以帮助你: 5 M* i( h9 h+ S5 Z" K- G+ ~static void AutoSqlBulkCopy(DataSet dataSet){ var sqlConnection = new SqlConnection("Data Source=sqlServer;Initial Catalog=mydatabase;user id=myuser;password=mypass;App=App"); sqlConnection.Open(); foreach (DataTable dataTable in dataSet.Tables) checking whether the table selected from the dataset exists in the database or not var checkTableIfExistsCommand = new SqlCommand("IF EXISTS (SELECT 1 FROM sysobjects WHERE name = '" dataTable.TableName "') SELECT 1 ELSE SELECT 0",sqlConnection); var exists = checkTableIfExistsCommand.ExecuteScalar().ToString().Equals("1"); if does not exist if (!exists) var createTableBuilder = new StringBuilder("CREATE TABLE [" dataTable.TableName "]"); createTableBuilder.AppendLine("("); selecting each column of the datatable to create a table in the database foreach (DataColumn dc in dataTable.Columns) createTableBuilder.AppendLine(" [" dc.ColumnName "] VARCHAR(MAX),"); createTableBuilder.Remove(createTableBuilder.Length - createTableBuilder.AppendLine(")"); var createTableCommand = new SqlCommand(createTableBuilder.ToString(),sqlConnection); createTableCommand.ExecuteNonQuery();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;if table exists,just copy the data to the destination table in the database copying the data from datatable to database table using (var bulkCopy = new SqlBulkCopy(sqlConnection)) bulkCopy.DestinationTableName = dataTable.TableName; bulkCopy.WriteToServer(dataTable); 可以这样使用: 8 P+ d, V j5 Z) O, uvar ds = new DataSet("MyDataSet");var dt = new DataTable("MyDataTable");dt.Columns.Add(new DataColumn("name",typeof(string)));dt.Columns.Add(new DataColumn("email",typeof(string)));dt.Columns.Add(new DataColumn("phone",typeof(string)));dt.Rows.Add("John","john@company.com","56765765");dt.Rows.Add("Tom","tom@company.com","8978987987");ds.Tables.Add(dt);AutoSqlBulkCopy(ds);