2013-05-21 2 views
1

Я новичок, который пытается научиться веб-программированию. Я делаю свой сайт в VS 2012 с помощью C#. У меня есть база данных, подключенная в папке App_Data, с использованием SQL Server CE 4.0. Я пытаюсь подключиться к нему следующим образом:Исключение при попытке подключения к SQL Server CE с C#

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(); 

Когда я выполняю это, я получаю следующее сообщение об ошибке:

An exception of type 'System.Data.SqlServerCe.SqlCeException' occurred in System.Data.SqlServerCe.dll but was not handled in user code

Любые мысли относительно того, что я делаю неправильно? Я пытался это выяснить часами.

+0

Вы должны использовать 'using' с этими объектами, такие как' используя (вар CMD = новый SQLCommand()) {} ', так они располагаются правильно и соединение закрыто (все, что реализует IDisposable). Кроме того, никогда не используйте конкатенацию строк для операторов SQL; ваш код уязвим для SQL-инъекций; вы должны использовать параметры SQL. –

+1

Попробуйте выполнить код в отладчике, и при появлении исключения вы сможете просверлить его, чтобы увидеть сообщение и возможное InnerException.Message. Сообщение может быть немного неопределенным, но это отправная точка. – AaronLS

+0

В какой-то момент вы должны поймать исключение и отобразить его где-нибудь через 'ex.ToString()' –

ответ

1

Вы сказали, что ваша база данных находится в каталоге APP_Data, но ваша строка подключения предполагает, что находится в корневом каталоге вашего сайта.

Попробуйте с

conn.ConnectionString = @"Data Source|DataDirectory|\MyData.sdf;Persist Security Info=False;"; 

| DataDirectory | является заполнителем строка, которую NET Framework изменяется на предопределенное место, где файлы вы данные являются supposed to stay

И это, как я хотел бы изменить код

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 protected]", conn)) 
{ 
    conn.Open(); 
    cmd1.Parameters.AddWithValue("@mail", user.Email); 
    SqlCeDataReader admin = cmd1.ExecuteReader(); 
    while(admin.Read()) 
    { 
     ..... 
    } 
} 

Как вы можете видеть, я сделал это изменения:

  • Добавлен using statement вокруг создания соединения и команды. Это обеспечит правильное закрытие и удаление двух объектов .
  • Добавлен parameterized query, чтобы избежать проблем при разборе текстовых строк и Sql Injections
+0

Спасибо за ответ Стив. К сожалению, он все еще выскакивает ту же ошибку. Я извлек исключение, это путь к файлу. "" Неверный путь. Проверьте каталог для базы данных. [Path = ~ \\ APP_DATA \\ MainDb.sdf] "}" –

+0

MainDb.sdf или MyData.sdf? – Steve

+0

MainDb.sdf - это имя базы данных, поэтому я изменил предложение строки подключения. –

Смежные вопросы