如何连接到 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 文件

如何将 JDBC 连接到 tns oracle

尝试在 C# 中连接到 Excel 电子表格

如何从 QlikView 连接到 Databricks Delta 表?