如何连接到 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 数据库?我尝试的没有连接字符串似乎有效的主要内容,如果未能解决你的问题,请参考以下文章