2011-04-20 42 views
7

我已經嘗試在我的連接字符串爲我的本地數據庫字面上50+不同的嘗試,似乎沒有任何工作。我基本上只是試圖打開一個連接數據庫文件,所以我可以轉儲我從我的Excel電子表格中提取的數據。我正在使用Visual C#製作一個離線的Winform應用程序。如何連接到SDF數據庫?沒有連接字符串我嘗試似乎工作

無論我在app.config中嘗試使用什麼連接字符串,它在嘗試將「dReader」寫入數據庫時​​總會失敗。

的錯誤通常是這取決於我嘗試什麼樣的字符串:。

「,而與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) 
    { 


    } 
} 

}

+0

不要介意,SDF文件是如何用於SQL Server的?我沒有注意到這樣的文件。但是如果你連接到sql server,你不要鏈接到文件。該文件需要被附加或恢復到sql服務器。所以你的連接字符串應該是這樣的:Server = myServerAddress; Database = myDataBase; User ID = myUsername; Password = myPassword; – 2011-04-20 01:12:35

+0

因此,SQL Server Compact只能與SQL服務器實例一起使用?我認爲它更獨立,是Access的替代品。我錯了嗎? – 2016-04-18 14:04:00

回答

3

嘗試......

第一:

首先創建,你可以檢查是否可以連接到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文件中的數據到一個DataTable和使用的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(); 
} 

問候

0

this後,使用SqlBulkCopy SqlCe不支持。

4

我認爲你看到的問題是你正在嘗試使用SqlConnection連接到SQL Compact數據庫。 .sdf是一個緊湊的數據庫,你必須使用SqlCeConnection來連接它。你使用這個創建了連接,但是你不使用它。而是將連接字符串傳遞給SqlBulkCopy對象,該對象隱式地從該字符串中創建SqlConnection。我假設它是在那個線路上,你得到的錯誤。如果您注意到SqlBulkCopy的名稱空間是System.Data.SqlClient。您看到錯誤的原因是它試圖通過SQL Server進行連接,並且無法解析您的連接字符串到SQL Server數據庫。不幸的是,我不認爲System.Data.SqlServerCe具有與SqlBulkCopy等效的功能。堅持使用System.Data.SqlServerCe中的類,並且事情應該按預期工作。您只需要以更手動的方式進行處理。

+0

+1:謝謝我正在尋找。所以我做了什麼:1.引用System.Data.SqlServerCe。 2將SqlConnection更改爲SqlCeConnection和SqlCommand以SqlCeCommand,一切都像一個魅力 – 2012-11-07 19:47:41