我需要一个解决方案将所有数据从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 = 路径]
当我使用
时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等。 - 同样的错误......
答案 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)
我还是新手,但据我所知,“私人空白”无法导入或导出。它只能在该类中读取或作为可执行文件。