C# 尝试从C连接到SQL Server CE时出现异常#

C# 尝试从C连接到SQL Server CE时出现异常#,c#,razor,visual-studio-2012,sql-server-ce,C#,Razor,Visual Studio 2012,Sql Server Ce,我是一个新手,正在尝试学习一些网络编程。我正在使用C#在VS2012中创建我的站点。我已经使用SQL Server CE 4.0在App_数据文件夹中连接了一个数据库。我正在尝试按如下方式连接到它: SqlCeCommand cmd1 = new SqlCeCommand("SELECT Admin FROM SystemUsers WHERE Email=" + user.Email); SqlCeDataReader admin = null; SqlCeConnection conn =

我是一个新手,正在尝试学习一些网络编程。我正在使用C#在VS2012中创建我的站点。我已经使用SQL Server CE 4.0在App_数据文件夹中连接了一个数据库。我正在尝试按如下方式连接到它:

SqlCeCommand cmd1 = new SqlCeCommand("SELECT Admin FROM SystemUsers WHERE Email=" + user.Email);
SqlCeDataReader admin = null;
SqlCeConnection conn = new SqlCeConnection();
conn.ConnectionString = "Data Source=MyData.sdf;Persist Security Info=False;";
conn.Open();
admin = cmd1.ExecuteReader();
执行此操作时,会出现以下错误:

System.Data.SqlServerCe.dll中发生“System.Data.SqlServerCe.SqlCeException”类型的异常,但未在用户代码中处理


有没有想过我做错了什么?我已经花了好几个小时试图弄清楚这一点。

您说过您的数据库位于APP_数据目录中,但您的连接字符串假定它位于站点的根目录中

试一试

conn.ConnectionString = @"Data Source|DataDirectory|\MyData.sdf;Persist Security Info=False;";
| DataDirectory |是一个占位符字符串,网络框架会将其更改为存储数据文件的预定义位置

这就是我如何改变你的代码

using(SqlCeConnection conn = new SqlCeConnection(@"Data Source|DataDirectory|\MyData.sdf;Persist Security Info=False;"))
using(SqlCeCommand cmd1 = new SqlCeCommand("SELECT Admin FROM SystemUsers WHERE Email=@mail", conn))
{
    conn.Open();
    cmd1.Parameters.AddWithValue("@mail", user.Email);
    SqlCeDataReader admin = cmd1.ExecuteReader();
    while(admin.Read())
    {
      .....
    }
}
如您所见,我做了以下更改:

  • 在创建连接和 命令。这将确保正确关闭和处理两个 对象
  • 添加了一个用于避免解析文本字符串时出现问题的 及

您说过您的数据库位于APP_数据目录中,但您的连接字符串假定数据库位于站点的根目录中

试一试

conn.ConnectionString = @"Data Source|DataDirectory|\MyData.sdf;Persist Security Info=False;";
| DataDirectory |是一个占位符字符串,网络框架会将其更改为存储数据文件的预定义位置

这就是我如何改变你的代码

using(SqlCeConnection conn = new SqlCeConnection(@"Data Source|DataDirectory|\MyData.sdf;Persist Security Info=False;"))
using(SqlCeCommand cmd1 = new SqlCeCommand("SELECT Admin FROM SystemUsers WHERE Email=@mail", conn))
{
    conn.Open();
    cmd1.Parameters.AddWithValue("@mail", user.Email);
    SqlCeDataReader admin = cmd1.ExecuteReader();
    while(admin.Read())
    {
      .....
    }
}
如您所见,我做了以下更改:

  • 在创建连接和 命令。这将确保正确关闭和处理两个 对象
  • 添加了一个用于避免解析文本字符串时出现问题的 及


您应该对这些对象使用
using
,例如
using(var cmd=new sqlCommand()){}
,这样它们就可以正确地进行处理,并关闭连接(任何实现IDisposable的东西)。另外,不要对SQL语句使用字符串连接;您的代码易受SQL注入攻击;您应该使用SQL参数。尝试在调试器中单步执行代码,当异常弹出时,您应该能够深入查看该消息以及可能的InnerException.Message。消息可能有点模糊,但它是一个起点。在某个时候,您应该捕获异常并通过
ex.ToString()
将其显示在某个位置。一旦您出现异常错误,我们可能会提供更多帮助。另外,如果你是一个新手,如果你要做web开发,你可能会考虑使用MVC 4,因为它向你介绍了一些最新的原则,特别是与数据库有关的原则,等等。你说你的数据库在APP_数据目录中,但是,您的连接字符串假定位于站点的根目录中,您应该对这些对象使用
use
,例如
use(var cmd=new sqlCommand()){}
,因此它们会正确处理,并且连接会关闭(任何实现IDisposable的东西)。另外,不要对SQL语句使用字符串连接;您的代码易受SQL注入攻击;您应该使用SQL参数。尝试在调试器中单步执行代码,当异常弹出时,您应该能够深入查看该消息以及可能的InnerException.Message。消息可能有点模糊,但它是一个起点。在某个时候,您应该捕获异常并通过
ex.ToString()
将其显示在某个位置。一旦您出现异常错误,我们可能会提供更多帮助。另外,如果你是一个新手,如果你要做web开发,你可能会考虑使用MVC 4,因为它向你介绍了一些最新的原则,特别是与数据库有关的原则,等等。你说你的数据库在APP_数据目录中,但是您的连接字符串假定它位于站点的根目录中。谢谢您的回答。不幸的是,它仍然吐出同样的错误。我确实提取了异常,它是文件路径。“”路径无效。检查数据库的目录。[Path=~\\APP\u DATA\\MainDb.sdf]“}”MainDb.sdf是数据库名称,我相应地更改了您的连接字符串建议。您也可以尝试使用替换字符串
“DATA Source=|DataDirectory\MainDb.sdf;…”
,以消除初始错误,谢谢!现在它的意思是“{”ExecuteReader:Connection属性尚未初始化。“}”我想我也犯了一些错误。我认为您的连接字符串应该是
@“数据源=|数据目录|\MyData.sdf。谢谢你的回答,史蒂夫。不幸的是,它仍然吐出同样的错误。我确实提取了异常,它是文件路径。“”路径无效。检查数据库的目录。[Path=~\\APP\u DATA\\MainDb.sdf]“}”MainDb.sdf是数据库名称,我相应地更改了您的连接字符串建议。您也可以尝试使用替换字符串
“DATA Source=|DataDirectory\MainDb.sdf;…”
,以消除初始错误,谢谢!现在,它说“{”ExecuteReader:Connection属性尚未初始化。“}”我想我也犯了一些错误。我认为您的连接字符串应该是
@“数据源=|数据目录| \MyData.sdf;…