Как я могу подключиться к базе данных SDF? Нет строки подключения, я пытаюсь, кажется, работает - PullRequest
7 голосов
/ 20 апреля 2011

Я пробовал буквально более 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)
    {


    }
}

}

Ответы [ 3 ]

4 голосов
/ 20 апреля 2011

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь использовать SqlConnection для подключения к базе данных SQL Compact..Sdf - это компактная база данных, и вам нужно использовать SqlCeConnection для подключения к ней.Вы создаете соединение, используя это, но затем не используете его.Вместо этого вы передаете строку соединения объекту SqlBulkCopy, который неявно создает SqlConnection из этой строки.Я предполагаю, что это на той линии, где вы получаете ошибку.Если вы заметили, что пространством имен SqlBulkCopy является System.Data.SqlClient.Причина, по которой вы видите ошибку, состоит в том, что она пытается пройти через SQL Server, чтобы установить соединение, и не может разрешить вашу строку подключения в базе данных SQL Server.К сожалению, я не думаю, что System.Data.SqlServerCe имеет эквивалент SqlBulkCopy.Придерживайтесь использования классов в System.Data.SqlServerCe, и все должно работать как положено.Вам просто нужно будет выполнить обработку более ручным способом.

3 голосов
/ 20 апреля 2011

Попробуйте это ...

Первый:

Сначала создайте тестовый метод, который вы можете проверить, можете ли вы подключиться к 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 голосов
/ 20 апреля 2011

Согласно этой записи, SqlBulkCopy не поддерживается с SqlCe.

...