回答

收藏

在使用sqlbulkcopy以前如何创建表

技术问答 技术问答 215 人阅读 | 0 人回复 | 2023-09-14

我有一个人想尝试导入。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(@&quotrovider=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);
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则