0

我正在玩 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 - 错误定位服务器/指定的实例)

4

2 回答 2

3

我正在使用 C# 和本地数据库(用于本地数据的空 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();
        }
    }
}
于 2013-08-02T14:01:43.147 回答
1

你需要使用:

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();
        }
    }
}
于 2013-08-02T13:59:12.383 回答