【问题标题】:How to Export Data from SQL server Compact To Access MDB如何从 SQL Server Compact 导出数据以访问 MDB
【发布时间】:2016-10-01 21:44:50
【问题描述】:

我需要一种将所有数据从 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子句中源数据库的格式应该如下:
[类型;数据库 = 路径]

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

【问题讨论】:

  • 你能显示字符串“source”中的内容吗?
  • @Tom Stude: 源和目标分别保存 sdf 和 mdb 文件的路径。
  • 也许这里是描述类型 - connectionstrings.com/… ?

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


【解决方案1】:

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

我很想知道使用 OLEDB 连接到 SQL Server Compact 数据库(@MrZak 在他的评论中指出的supported)在 C# 中可以完成什么。我想出了以下内容。它将 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();
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 对不起,但你最好阅读这个问题。 private void 它是我的 C# 方法的签名 - 它与数据导出无关。
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2010-12-12
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多