0

定期的にデータが更新される Microsoft SQL Server データベースがあります。C# を使用して、このデータベースをすべてのテーブル (およびできればリレーションシップ) と共に新しい Microsoft Access (.accdb) ファイルに保存したいと考えています。

SQL Management Studio がシステムにインストールされているため、コードから BCP ( http://msdn.microsoft.com/en-us/library/ms162802.aspx )を呼び出すことが 1 つの解決策になると思いますが、わかりませんこの場合の正しい使い方。ただし、BCPを使用せずにそれを行うより良い方法があると思います。

誰でもこれを達成する方法を推奨できますか?

ありがとうございました

4

2 に答える 2

2

Access で MSSQL データをインポートできます。詳細: http://office.microsoft.com/en-us/access-help/import-or-link-to-sql-server-data-HA010200494.aspx

アップデート:

または、sqldataadapter を使用してすべてのテーブルを選択し、すべてをデータセットに格納することもできます。次を参照してください: SQL Server データベースからのデータセットの取得

そこから、データセットを Access データベース ファイルとして保存できます。参照: C# データセットから Access DB

たぶん、これはあなたの問題とより一致しています。

于 2013-04-16T13:47:44.257 に答える
1

Ferdy の提案のおかげで、問題は解決しました。他の人に役立つ可能性があるため、実際のコードサンプルをここに置きます。

//The connection strings needed: One for SQL and one for Access
String accessConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\...\\test.accdb;";
String sqlConnectionString = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Your_Catalog;Integrated Security=True";   

//Make adapters for each table we want to export
SqlDataAdapter adapter1 = new SqlDataAdapter("select * from Table1", sqlConnectionString);
SqlDataAdapter adapter2 = new SqlDataAdapter("select * from Table2", sqlConnectionString);

//Fills the data set with data from the SQL database
DataSet dataSet = new DataSet();
adapter1.Fill(dataSet, "Table1");
adapter2.Fill(dataSet, "Table2");

//Create an empty Access file that we will fill with data from the data set
ADOX.Catalog catalog = new ADOX.Catalog();
catalog.Create(accessConnectionString);

//Create an Access connection and a command that we'll use
OleDbConnection accessConnection = new OleDbConnection(accessConnectionString);
OleDbCommand command = new OleDbCommand();
command.Connection = accessConnection;
command.CommandType = CommandType.Text;
accessConnection.Open();

//This loop creates the structure of the database
foreach (DataTable table in dataSet.Tables)
{
    String columnsCommandText = "(";
    foreach (DataColumn column in table.Columns)
    {
        String columnName = column.ColumnName;
        String dataTypeName = column.DataType.Name;
        String sqlDataTypeName = getSqlDataTypeName(dataTypeName);
        columnsCommandText += "[" + columnName + "] " + sqlDataTypeName + ",";
    }
    columnsCommandText = columnsCommandText.Remove(columnsCommandText.Length - 1);
    columnsCommandText += ")";

    command.CommandText = "CREATE TABLE " + table.TableName + columnsCommandText;

    command.ExecuteNonQuery();
}

//This loop fills the database with all information
foreach (DataTable table in dataSet.Tables)
{
    foreach (DataRow row in table.Rows)
    {
        String commandText = "INSERT INTO " + table.TableName + " VALUES (";
        foreach (var item in row.ItemArray)
        {
            commandText += "'"+item.ToString() + "',";
        }
        commandText = commandText.Remove(commandText.Length - 1);
        commandText += ")";

        command.CommandText = commandText;
        command.ExecuteNonQuery();
    }
}

accessConnection.Close();
于 2013-04-17T15:48:50.857 に答える