2011-04-20 24 views
7

He intentado literalmente más de 50 intentos diferentes en mi cadena de conexión para mi base de datos local y nada parece funcionar. Básicamente, estoy tratando de abrir una conexión con el archivo de la base de datos para poder volcar los datos que saqué de mi hoja de cálculo de Excel. Estoy usando Visual C# para hacer una aplicación winform sin conexión.¿Cómo me puedo conectar a una base de datos SDF? Ninguna cadena de conexión que intento parece funcionar

No importa qué cadena de conexión intente en mi app.config, siempre falla cuando intenta escribir "dReader" en la base de datos.

El error es por lo general esto dependiendo de qué cadena lo intento:..

"Se ha producido un error relacionado con la red o específico de la instancia al establecer una conexión a SQL Server El servidor no se ha encontrado o no era accesible Verify que el nombre de instancia es correcto y que SQL Server está configurado para permitir conexiones remotas. (proveedor: Proveedor de canalizaciones con nombre, error: 40 - No se pudo abrir una conexión con SQL Server) "

He revisado muchos ejemplos en línea y recursos, y ninguno parece funcionar. Espero que alguien aquí pueda señalar por qué está fallando.

Aquí es mi app.config en su última forma:

<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> 

Aquí está mi código del formulario:

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

no hacer ¿cómo funciona el archivo SDF para SQL Server? No he notado ese archivo.Pero si te estás conectando al servidor sql, no lo vinculas al archivo. El archivo necesita ser adjuntado o restaurado al servidor sql. Por lo tanto, su cadena de conexión debería ser algo como esto en su lugar: Server = myServerAddress; Database = myDataBase; ID de usuario = myUsername; Password = myPassword; –

+0

¿Entonces SQL Server Compact solo se puede usar con una instancia de servidor SQL? Pensé que era más independiente, un reemplazo para Access. ¿Me equivoco? –

Respuesta

3

Prueba esto ...

Primero:

crear primero un método de prueba que es posible comprobar si puede conectarse a 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(); 
    } 
    } 
} 

Segundo:

sólo tiene que cargar los datos del archivo de Excel en un DataTable y utilizar foreach luego guardarlo en el archivo de base de 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(); 
} 

Saludos

0

Según this puesto, SqlBulkCopy no es compatible con SqlCe.

4

Creo que el problema que está viendo es que está tratando de usar una SqlConnection para conectarse a una base de datos SQL Compact. .sdf es una base de datos compacta y debe usar SqlCeConnection para conectarse a ella. Usted crea la conexión usando esto pero luego no lo usa. En su lugar, pasa la cadena de conexión al objeto SqlBulkCopy que implícitamente crea una SqlConnection a partir de esa cadena. Supongo que está en esa línea donde está obteniendo el error. Si observa que el espacio de nombre de SqlBulkCopy es System.Data.SqlClient. La razón por la que está viendo el error es que trata de pasar por el servidor SQL para hacer la conexión y no puede resolver su cadena de conexión a una base de datos de SQL Server. Desafortunadamente, no creo que System.Data.SqlServerCe tenga el equivalente a SqlBulkCopy. Limítese a usar clases en System.Data.SqlServerCe y las cosas deberían funcionar como se esperaba. Simplemente tendrá que hacer el procesamiento de una manera más manual.

+0

+1: Gracias. Estaba buscando eso. Entonces lo que hice: 1. Haga referencia a System.Data.SqlServerCe. 2 SqlConnection cambiado a SqlCeConnection y SqlCommand a SqlCeCommand y todo funciona como un encanto –

Cuestiones relacionadas