如何从SQL Server Compact中导出数据以访问MDB

时间:2013-06-22 17:33:25

标签: c# database ms-access export sql-server-ce

我需要一个解决方案将所有数据从SQL Server CE传输到Access mdb数据库。

我尝试了这种方法http://www.codeproject.com/Answers/483989/HowplustoplusExportplusSQLplusTablesplusToplusAcce#answer2(解决方案#2),但收到错误“在连接字符串或IN子句中没有指定数据库。”

如果我连接到非紧凑型SQL服务器,代码就可以工作。

我想问题是IN子句中的连接字符串,但我无法弄清楚如何更改它。

这是我的代码:

private void ExportTable(string tableName, string source, string destination)
{
    var connStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", destination);
    var cmdText = string.Format("SELECT * INTO {0} FROM [{0}] IN ''[Data Source={1};Max Database Size='4000';Persist Security Info=False;];", tableName, source);

    using (var conn = new OleDbConnection(connStr))
    {
            conn.Open();
            using (var cmd = new OleDbCommand(cmdText, conn))
            {
                cmd.ExecuteNonQuery(); // error on this line
            }

            conn.Close();
    }
}

连接字符串:数据源= {1};最大数据库大小='4000';持久安全信息=假;我直接连接数据库时工作正常。

更新:显然,IN子句中源数据库的格式应如下:
 [; DATABASE = 路径]

(见:http://answers.microsoft.com/en-us/office/forum/office_2010-access/access-2010-runtime-error-3170-could-not-find/0b085797-618a-488f-b1b4-30af00f04b3f

当我使用

var cmdText = string.Format("SELECT * INTO {0} FROM [{0}] IN ''[SqlServer CE; DATABASE={1}];", tableName, source);

我遇到了不同的错误:无法找到可安装的ISAM。

您是否知道SQLServer CE的类型是正确的?它是否受到支持?我找不到任何关于它的信息。

我也尝试过:SQL CE,SQLSERVER.CE,Microsoft.SQLSERVER.CE.OLEDB.3.5,Microsoft.SQLSERVER.MOBILE.OLEDB.3.0等。 - 同样的错误......

2 个答案:

答案 0 :(得分:1)

我认为这里的绊脚石是您尝试使用的技巧需要与SQL Server建立ODBC连接,据我所知,SQL Server Compact没有ODBC驱动程序。我很确定Access中的语法[ODBC;Driver=...]没有OLEDB等效,因此该技巧不适用于SQL Server Compact。 (正如您所发现的那样,它 与“真正的”SQL Server一起工作,因为该平台支持ODBC连接。)

我很想知道在C#中使用OLEDB连接到SQL Server Compact数据库(supported可以完成的事情,正如@MrZak在他的评论中指出的那样)。我想出了以下内容。它将SQL表拉入DataTable,将每行的状态设置为“Added”,然后更新(插入)Access中的相应表。

string myConnectionStringMDB =
        "Provider=Microsoft.ACE.OLEDB.12.0;" +
        @"Data Source=C:\Users\Gord\Desktop\fromCE.mdb;";
string myConnectionStringSQL =
        "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;" +
        @"Data Source=C:\Users\Public\test\myData.sdf;";

using (OleDbConnection conSQL = new OleDbConnection(),
        conMDB = new OleDbConnection())
{
    conSQL.ConnectionString = myConnectionStringSQL;
    conSQL.Open();
    conMDB.ConnectionString = myConnectionStringMDB;
    conMDB.Open();

    using (OleDbCommand cmdSQL = new OleDbCommand(),
            cmdMDB = new OleDbCommand())
    {
        cmdSQL.CommandType = System.Data.CommandType.Text;
        cmdSQL.Connection = conSQL;
        cmdSQL.CommandText = "SELECT * FROM [Table1]";

        var daSQL = new System.Data.OleDb.OleDbDataAdapter(cmdSQL);
        var dt = new System.Data.DataTable();
        daSQL.Fill(dt);

        foreach (System.Data.DataRow dr in dt.Rows)
        {
            // change row status from "Unchanged" to "Added" so .Update below will insert them
            dr.SetAdded();
        }

        cmdMDB.CommandType = System.Data.CommandType.Text;
        cmdMDB.Connection = conMDB;
        cmdMDB.CommandText = "SELECT * FROM [Table1]";
        var daMDB = new System.Data.OleDb.OleDbDataAdapter(cmdMDB);
        var cbuilderMDB = new OleDbCommandBuilder(daMDB);
        cbuilderMDB.QuotePrefix = "[";
        cbuilderMDB.QuoteSuffix = "]";
        daMDB.Update(dt);
    }
    conSQL.Close();
    conMDB.Close();
}

答案 1 :(得分:-1)

我还是新手,但据我所知,“私人空白”无法导入或导出。它只能在该类中读取或作为可执行文件。