如何在使用sqlbulkcopy之前创建表
本文关键字:创建 sqlbulkcopy | 更新日期: 2023-09-27 18:06:39
我有一个DBF文件,我试图导入,然后将其写入SQL表。我遇到的问题是,如果我使用SqlBulkCopy,它需要我提前创建表,但这在我的场景中是不可能的,因为dbf文件不断变化。
下面是我的代码:public void saveDBF()
{
//define the connections to the .dbf file
OleDbConnection oConn = new OleDbConnection(@"Provider=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);
上一直失败,表示无法访问目标表。
在c#中是否有一个选项可以在写入表之前动态创建表?
这个方法可以帮助您:
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 - 1, 1);
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);
}
}
}
你可以这样使用:
var 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);