2010-10-21 3 views
1

Следующий пример кода случайным образом не работает на некоторых компьютерах. На других ПК проблема не может быть воспроизведена. На всех ПК работает .NET 3.5 SP1 на Vista SP1.LINQ не удается создать базу данных

string connection = @"Data Source=PCNAME\SQLEXPRESS;Database=TestDatabase ;User Id=sa;Password=ThePassword;"; 

TestDatabase db = new TestDatabase (connection); 

if (!db.DatabaseExists()) 
{ 
    db.CreateDatabase(); 
} 

DatabaseExists() возвращается false но CreateDatabase() бросает это исключение:

System.Data.SqlClient.SqlException: Database 'TestDatabase' уже существует. Выберите другую базу данных имя.

В документации указано, что DatabaseExists() возвращает true, если база данных существует и может быть открыта.

Что может привести к тому, что база данных не будет доступна?

EDIT: Сервер базы данных SQL Server Express 2008

ответ

0

Проблемы с подключением вызваны свойством AUTO_CLOSE, для которого установлено значение true. Это значение по умолчанию для всех баз данных SQL Server Express 2008.

Установка этой функции для отключения решить эту проблему:

ALTER DATABASE [database] SET AUTO_CLOSE OFF 

Поскольку AUTO_CLOSE останавливает базу данных после 30 секунд простоя времени, это также решить другие необъяснимые ошибки связанных с базой данных в приложении.

More info on AUTO_CLOSE

2

Это может быть проблемой прав, то есть база данных существует, но у вас нет разрешения, чтобы открыть его. Это вернет false, а также исключение, которое вы предоставили.

+0

Самое странное в том, что проблема приходит и уходит на некоторых машинах. То есть один момент, когда он терпит неудачу, следующий его успех. – Fedearne

+0

Является ли это последовательным исполнением вашего кода, не делая ничего (и я имею в виду что-либо) между ними? Если это так, то это действительно очень странно. – Lazarus

+0

Я делаю во время запуска приложения. Если я получу ошибку - я просто перезапущу приложение, и я обычно работаю сразу. – Fedearne

0

Просто создал простое приложение для Windows с помощью следующего кода ...

 string connection = @"Data Source=.\SQLEXPRESS;Database=TestDatabase;Integrated Security=True"; 

     LinqToSQLDataContext dc = new LinqToSQLDataContext(connection); 

     if (!dc.DatabaseExists()) 
     { 
      dc.CreateDatabase(); 
     } 

Убедитесь, что не было никакой базы данных с именем TestDatabase. Поскольку код работает так, как ожидалось. Единственное отличие в моем случае заключается в том, что я использую Integrated Security. Конечно, это не полный код, и я получаю сообщение об ошибке, как ожидается, в dc.CreateDatabase следующим образом ...

alt text

Таким образом, я могу подтвердить, что код хорошо. Похоже, что у вас недостаточно перм на сервере.

0

Это может быть многопользовательская гонка?

User1: test database existance (false) 
User2: test database existance (false) 
User1: create database 
User2: create database (exception!) 
+0

Это хорошая теория, но база данных уже существует, когда приложение запускается. – Fedearne

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