如何连接到 SDF 数据库?我尝试的没有连接字符串似乎有效
Posted
技术标签:
【中文标题】如何连接到 SDF 数据库?我尝试的没有连接字符串似乎有效【英文标题】:How can I connect to a SDF database? No connection string I try seems to work 【发布时间】:2011-04-20 00:59:52 【问题描述】:我已经在本地数据库的连接字符串上尝试了 50 多次不同的尝试,但似乎没有任何效果。我本质上只是试图打开数据库文件的连接,这样我就可以转储从我的 excel 电子表格中提取的数据。我正在使用 Visual C# 制作离线 winform 应用程序。
无论我在 app.config 中尝试什么连接字符串,当它尝试将“dReader”写入数据库时总是失败。
错误通常是这样的,具体取决于我尝试的字符串:
“在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到或无法访问服务器。请验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)"
我浏览了许多在线示例和资源,但似乎没有一个有效。我希望这里有人能指出它失败的原因。
这是我的最新形式的 app.config:
<connectionStrings>
<add name="DDP_Project.Properties.Settings.DDP_DatabaseConnectionString"
connectionString="Data Source=E:\Other DDP Projects\DDP_Project_SDF\DDP_Project\DDP_Database.sdf;"
providerName="Microsoft.SqlServerCe.Client.3.5" />
</connectionStrings>
这是我的表单代码:
private void Profiles_Click(object sender, EventArgs e)
profilesDialog.FileName = "[YOUR_UPLOAD_FILE_HERE]";
var result = profilesDialog.ShowDialog();
if (result == DialogResult.OK)
HandleFileSelection();
private void HandleFileSelection()
var file = profilesDialog.FileName;
// Create a connection to the file datafile.sdf in the program folder
string dbfile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + "\\DDP_Database.sdf";
SqlCeConnection connection = new SqlCeConnection("datasource=" + dbfile);
string strConnection = ConfigurationManager.ConnectionStrings["DDP_Project.Properties.Settings.DDP_DatabaseConnectionString"].ConnectionString;
//Create connection string to Excel work book
string excelConnectionString = string.Format(
@"Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=""0"";
Extended Properties=""Excel 8.0;HDR=YES;""", file
);
//Create Connection to Excel work book
OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);
OleDbCommand cmd = new OleDbCommand("SELECT [ID],[STATUS],[FAN_NUM],[PROFILE_NAME],[DESTINATION_HOST],[USER_ID],[USER_PASSWORD],[PROTOCOL],[PORT],[PATH],[CONTACT_NAME],[CONTACT_EMAIL],[CONTACT_PHONE],[CONTACT_ALT_PHONE],[CONTACT_CITY],[CONTACT_STATE],[CONTACT_CONTACT_TIME] FROM [Sheet1$]", excelConnection);
excelConnection.Open();
OleDbDataReader dReader;
dReader = cmd.ExecuteReader();
SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection);
sqlBulk.DestinationTableName = "Profiles";
sqlBulk.ColumnMappings.Add("ID", "ID");
sqlBulk.ColumnMappings.Add("STATUS", "STATUS");
sqlBulk.ColumnMappings.Add("FAN_NUM", "FAN_NUM");
sqlBulk.ColumnMappings.Add("PROFILE_NAME", "PROFILE_NAME");
sqlBulk.ColumnMappings.Add("DESTINATION_HOST", "DESTINATION_HOST");
sqlBulk.ColumnMappings.Add("USER_ID", "USER_ID");
sqlBulk.ColumnMappings.Add("USER_PASSWORD", "USER_PASSWORD");
sqlBulk.ColumnMappings.Add("PROTOCOL", "PROTOCOL");
sqlBulk.ColumnMappings.Add("PORT", "PORT");
sqlBulk.ColumnMappings.Add("PATH", "PATH");
sqlBulk.ColumnMappings.Add("CONTACT_NAME", "CONTACT_NAME");
sqlBulk.ColumnMappings.Add("CONTACT_EMAIL", "CONTACT_EMAIL");
sqlBulk.ColumnMappings.Add("CONTACT_PHONE", "CONTACT_PHONE");
sqlBulk.ColumnMappings.Add("CONTACT_ALT_PHONE", "CONTACT_ALT_PHONE");
sqlBulk.ColumnMappings.Add("CONTACT_CITY", "CONTACT_CITY");
sqlBulk.ColumnMappings.Add("CONTACT_STATE", "CONTACT_STATE");
sqlBulk.ColumnMappings.Add("CONTACT_CONTACT_TIME", "CONTACT_CONTACT_TIME");
sqlBulk.WriteToServer(dReader);
sqlBulk.Close();
excelConnection.Close();
private void profilesDialog_FileOk(object sender, EventArgs e)
【问题讨论】:
别介意,SQL Server 的 SDF 文件怎么样?我没有注意到这样的文件。但是如果你连接到 sql server,你不要链接到文件。该文件需要附加或恢复到 sql server。所以你的连接字符串应该是这样的: Server=myServerAddress;Database=myDataBase;User ID=myUsername;Password=myPassword; 那么 SQL Server Compact 只能用于 SQL Server 实例吗?我认为它更独立,可以替代 Access。我错了吗? 【参考方案1】:我认为您看到的问题是您正在尝试使用 SqlConnection 连接到 SQL Compact 数据库。 .sdf 是一个紧凑型数据库,您必须使用 SqlCeConnection 连接到它。您使用它创建连接,但随后您不使用它。相反,您将连接字符串传递给 SqlBulkCopy 对象,该对象从该字符串隐式创建 SqlConnection。我假设它在您收到错误的那条线上。如果您注意到 SqlBulkCopy 的命名空间是 System.Data.SqlClient。您看到该错误的原因是它试图通过 SQL Server 建立连接,但无法将您的连接字符串解析为 SQL Server 数据库。不幸的是,我不认为 System.Data.SqlServerCe 具有与 SqlBulkCopy 等效的功能。坚持使用 System.Data.SqlServerCe 中的类,事情应该会按预期工作。您只需要以更手动的方式进行处理。
【讨论】:
+1 :谢谢我一直在寻找那个。所以我做了什么: 1. 引用 System.Data.SqlServerCe。 2 将 SqlConnection 更改为 SqlCeConnection 并将 SqlCommand 更改为 SqlCeCommand ,一切都像一个魅力【参考方案2】:试试这个...
第一:
首先创建一个测试方法,您可以检查是否可以连接到 sqlcedatabase。
private void testconnection()
string strConnection = ConfigurationManager.ConnectionStrings["DDP_Project.Properties.Settings.DDP_DatabaseConnectionString"].ConnectionString;
using (var conn = new SqlCeConnection(string.Format("Data Source=0;Max Database Size=4091;Max Buffer Size = 1024;Default Lock Escalation =100;", strConnection)))
conn.Open();
try
//your Stuff
catch (SqlCeException)
throw;
finally
if (conn.State == ConnectionState.Open) conn.Close();
第二:
只需将您的 excel 文件数据加载到数据表中并使用 foreach 然后将其保存到您的 sql ce 数据库文件中。..
//Something like
//oledbcon
//oledb dataadapter
//datatable
// dapt.Fill(dt);
foreach(DataRow excel in dt.Rows)
ceCmd.Parameters.AddWithValue("ID",excel["ID"]);
ceCmd.ExecuteNonQuery();
问候
【讨论】:
【参考方案3】:根据this 的帖子,SqlCe 不支持 SqlBulkCopy。
【讨论】:
以上是关于如何连接到 SDF 数据库?我尝试的没有连接字符串似乎有效的主要内容,如果未能解决你的问题,请参考以下文章
SQL Compact Edition,无法连接到本地 sdf 文件
如何从 .NET 应用程序连接到 SQL Server Compact?
无法连接到 windows mobile 6.5.3 设备上的 sql server management studio 中的 sdf 文件