Не удается подключиться к локальной базе данных

Я играю с C# и локальной базой данных (An empty SQL Server Compact Edition database for local data)

Но я не могу подключиться к базе данных и получить данные.

Вот что я пытаюсь:

// Properties.Settings.Default.DatabaseConnectionString = Data Source=|DataDirectory|\Database.sdf
// I guess Visual Studio put it there after I created my database...

using(SqlConnection sqlConnection = new SqlConnection(Properties.Settings.Default.DatabaseConnectionString)) {
    using(SqlCommand sqlCommand = new SqlCommand("SELECT * FROM users WHERE id = @id", sqlConnection)) {
        sqlCommand.CommandType = CommandType.StoredProcedure;
        sqlCommand.Parameters.AddWithValue("@id", 1);
        try {
            sqlConnection.Open();
            SqlDataReader reader = sqlCommand.ExecuteReader(CommandBehavior.SingleRow);
            if(reader.Read()) {
                System.Console.WriteLine(reader);
                System.Console.WriteLine(reader["id"]);
                System.Console.WriteLine(reader["name"]);
            }
        }
        catch(Exception e) {
            System.Console.WriteLine(e.GetBaseException());
        }
        finally {
            sqlConnection.Close();
        }
    }
}

Вся моя программа зависает на некоторое время, после паузы я получаю это сообщение:

При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен на разрешение удаленных подключений. (поставщик: Сетевые интерфейсы SQL, ошибка: 26 — Ошибка при обнаружении указанного сервера/экземпляра)


person Ron van der Heijden    schedule 02.08.2013    source источник
comment
Вы уверены, что ваша строка подключения верна?   -  person Soner Gönül    schedule 02.08.2013
comment
Вы должны быть уверены, что named pipes включены.   -  person Maris    schedule 02.08.2013
comment
@SonerGönül Ну, Visual Studio поместила его туда, так что, я думаю, ему там место?   -  person Ron van der Heijden    schedule 02.08.2013
comment
выше ошибка 100%, связанная со строкой подключения, я добавляю Database.connectionString к вопросу   -  person Anant Dabhi    schedule 02.08.2013
comment
@AnantDabhi Да, это произошло из базы данных класса со статической строкой. В примере я изменил ее на настройки свойств, сделанные Visual Studio.   -  person Ron van der Heijden    schedule 02.08.2013


Ответы (2)


Я играю с С# и локальной базой данных (пустая база данных SQL Server Compact Edition для локальных данных)

Вы используете файл Sql Server Compact, а не Sql Server Local DB

Для работы с Sql Server Compact необходимо использовать пространство имен System.Data.SqlServerCe, а не System.Data.SqlServer.

Заменить SqlConnection, SqlCommand, ...

С SqlceConnection, SqlCeCommand, ...


А хранимые процедуры не поддерживаются в Sql Server Compact (Как использовать хранимую процедуру в SqlCE), поэтому sqlCeCommand.CommandType не может быть CommandType.StoredProcedure.

Вам нужно использовать commandType.Text с параметрами команды.

using(SqlCeConnection sqlCeConnection = new SqlCeConnection(Properties.Settings.Default.DatabaseConnectionString)) {
    using(SqlCeCommand sqlCeCommand = new SqlCeCommand("SELECT * FROM users WHERE id = @id", sqlCeConnection)) {
        sqlCeCommand.CommandType = CommandType.Text;
        sqlCeCommand.Parameters.AddWithValue("@id", 1);
        try {
            sqlCeConnection.Open();
            SqlCeDataReader reader = sqlCeCommand.ExecuteReader(CommandBehavior.SingleRow);
            if(reader.Read()) {
                System.Console.WriteLine(reader);
                System.Console.WriteLine(reader["id"]);
                System.Console.WriteLine(reader["name"]);
            }
        }
        catch(Exception e) {
            System.Console.WriteLine(e.GetBaseException());
        }
        finally {
            sqlCeConnection.Close();
        }
    }
}
person Chris    schedule 02.08.2013
comment
Спасибо! Итак, мой тип базы данных неверен. Какой тип мне нужен для локальной базы данных с использованием подготовленных операторов? Экспресс-версия? - person Ron van der Heijden; 02.08.2013
comment
@Bondye Я не уверен, что понимаю, что вы ищете. Что вы подразумеваете под «использованием подготовленных операторов»? - person Chris; 02.08.2013
comment
Хм... Просто Подготовленные операторы, чтобы предотвратить некоторые инъекции и накладные расходы. - person Ron van der Heijden; 02.08.2013
comment
@Bondye OK ... Так что просто создайте свою базу данных из Visual Studio или скопируйте существующую базу данных в свой проект и позвольте Visual Studio создать типизированный набор данных и соответствующий код. Есть смысл? - person Chris; 02.08.2013

Вам нужно использовать:

using System.Data.SqlServerCe;

А потом

using (SqlCeConnection sqlConnection = new SqlCeConnection(Properties.Settings.Default.DatabaseConnectionString))
{
    using (SqlCeCommand sqlCommand = new SqlCeCommand("SELECT * FROM users WHERE id = @id", sqlConnection))
    {
        sqlCommand.CommandType = CommandType.Text;
        sqlCommand.Parameters.AddWithValue("@id", 1);
        try
        {
            sqlConnection.Open();
            SqlCeDataReader reader = sqlCommand.ExecuteReader(CommandBehavior.SingleRow);
            if (reader.Read())
            {
                System.Console.WriteLine(reader);
                System.Console.WriteLine(reader["id"]);
                System.Console.WriteLine(reader["name"]);
            }
        }
        catch (Exception e)
        {
            System.Console.WriteLine(e.GetBaseException());
        }
        finally
        {
            sqlConnection.Close();
        }
    }
}
person Alex Filipovici    schedule 02.08.2013