1

我需要一种将所有数据从 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();
    }
}

连接字符串:Data Source={1};Max Database Size='4000';Persist Security Info=False; 当我直接连接到数据库时工作正常。

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

(参见: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 等 - 同样的错误...

4

2 回答 2

1

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

我很想知道我可以在 C# 中使用 OLEDB 连接到 SQL Server Compact 数据库(这是受支持的,正如 @MrZak 在他的评论中指出的那样)。我想出了以下内容。它将 SQL 表拉入 DataTable,将每一行的状态设置为“已添加”,然后更新(插入)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();
}
于 2013-06-22T21:11:26.030 回答
-1

我对此仍然很陌生,但是据我所知,“私人无效”无法导入或导出。它只能在该类中读取或作为可执行文件读取。

于 2013-06-22T17:37:28.180 回答