Странное поведение: ASP.NET на Sql Server
ХОРОШО. поэтому прежде чем задать вопрос вот фон. Я только что прошел этап разработки ASP.NET и создал полнофункциональное веб-приложение на локальном компьютере. Поэтому я передаю файлы в созданную веб-папку IIS на сервере Windows, на котором она должна работать, чтобы проверить, работает ли она так, как должна. Оно делает!
Так что проблема в этом. Когда я набираю информацию, я нажимаю кнопку 1 и просто получаю обратную передачу, что нормально, если вы посмотрите на мой код. Я иду, чтобы проверить базу данных с помощью Sql Server Management, а затем я увидел это..... НИЧЕГО не было!
Ниже приведены некоторые подробности, которые помогут вам решить эту проблему, а также приведенный ниже код.
Особенности:
- Windows Server 2003
- SQL Server 2005
- .NET Framework 2.0
- IIS 6
Разметка, как и ожидалось, с правильными именами textBox и всем
Код C#:
protected void Button1_Click(object sender, EventArgs e) {
SqlConnection connection = new SqlConnection(@"Data Source=myServerName;Initial Catalog=myDatabaseName;Integrated Security=True");
SqlCommand cmd = new SqlCommand("insert into [PATIENT]([MRN], [PFNAME], [DOB]) "
+ " Values(@MRN, @PFNAME, @DOB)", connection);
cmd.Parameters.AddWithValue("@MRN", int.Parse(MRNTextBox.Text));
cmd.Parameters.AddWithValue("@PFNAME", NameTextBox.Text);
cmd.Parameters.AddWithValue("@DOB", DOBTextBox.Text);
connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
Это код. Я не мог даже приблизиться к предположению, где может быть проблема, потому что я не получаю никаких сообщений об ошибках. Пожалуйста, дайте мне знать, если вам требуется дополнительная информация. Я с удовольствием предоставлю.
PS Я запускаю веб-сайт через IIS, а не через сервер разработки ASP.NET (если я об этом уже не упомянул. Поэтому, если он работает на вашем "Просмотр в браузере" из VS, я был бы рад узнать ")
РЕДАКТИРОВАТЬ
Я хочу поблагодарить всех за помощь. Я выполнил большинство ваших рекомендаций и надеюсь, что после того, как я выясню новую проблему (получаю исключение при входе в систему, YAY!!), я смогу использовать ваши комментарии на практике. Все вы будете думать, что я идиот (и сейчас я чувствую себя так, как сейчас), но причина, по которой я не смог увидеть изменения, заключалась в том, что я не создавал код C#. Я знаю некоторые упомянутые компиляции, но я предполагал, что это компиляция, потому что каждый раз, когда я вносил изменения в разметку, они мгновенно появлялись в сети. Я настолько привык к "View in Browser", что забыл, что Visual Studio автоматически компилирует код (я думаю)
5 ответов
Первое, к чему я бы стремился, это добавить некоторые инструменты в код. Самый простой способ - добавить трассировку. Это обеспечит правильную передачу событий и запуск событий. Если вы не видите нажатия кнопки на трассировке, значит, у вас проблема с пользовательским интерфейсом, и вы можете сосредоточиться на ней. Чаще всего это неправильная установка директивы @ Page, но есть и другие возможные причины.
Следующим шагом для устранения неполадок является профилирование сервера, на который вы попали, если это возможно. Надеемся, что вы не развертываете напрямую в производство, и у вас есть промежуточная среда, в которую вы можете поиграть с этим.
Моим последним шагом будет рефакторинг фактического кода данных из вашего слоя пользовательского интерфейса и создание тестируемого "хранилища" (независимо от того, используете ли вы шаблон хранилища - причина для кавычек). Затем вы можете окружить код тестами и убедиться, что код работает. Вам все еще нужно проследить, чтобы убедиться, что библиотека вызывается и события правильно связаны, но разделение задач позволит вам лучше решать проблемы с кодом доступа к данным.
Ладно, не так окончательно. Вам нужно извлечь магические строки из вашего кода и переместить их в конфигурацию, где они принадлежат. Жесткое кодирование == плохое джиу.
Надеюсь это поможет!
Самое простое объяснение заключается в том, что вы попали не в ту базу данных. В противном случае вы должны увидеть некоторые ошибки. Вы не молча ловите исключения, не так ли?
Если вы уверены, что событие запускается, то наиболее вероятной причиной является использование Integrated Security. Помните, что процесс ASP.NET не эквивалентен вашему личному логину. Интегрированная защита работает только в том случае, если вы вошли в систему и получили доступ к базе данных через учетную запись или группу (например, администраторы), которой явно была назначена учетная запись в базе данных. Единственное сомнение здесь - почему вы не получаете сообщение об ошибке при попытке подключения.
НЕ поддавайтесь искушению предоставить учетной записи IIS_IUSRS доступ к базе данных - это приглашение к неприятностям. Вместо этого используйте учетную запись SQL Server с соответствующим и безопасным паролем в строке входа в систему. Таким образом, вам не нужно беспокоиться о состоянии IIS_IUSRS в отношении вашей базы данных.
В качестве примечания вы быстро устанете от явного открытия соединений, настройки команд, добавления параметров и т. Д. Я настоятельно рекомендую либо принять коммерческий ORM, либо, что еще лучше, внедрить облегченный уровень доступа к данным, который автоматизирует большая часть тяжелой работы.
Ваш код кажется в порядке. Вы упомянули в своем вопросе, что вы не получаете никаких исключений, и ваш код также не работает. Может быть, вы можете попробовать это так, чтобы вы как минимум поймали любое исключение, если у вас есть в коде, который может молча вызывать проблему.
Добавьте файл Global.asax в свой веб-проект и добавьте в него событие Application_Error. Ниже приведены подписи для того же
protected void Application_Error(object sender, EventArgs e)
{
}
Это одно событие, которое поймает любое исключение в вашем веб-проекте, независимо от того, где это исключение происходит в вашем проекте. Как только он достигнет точки останова, проверьте объект отправителя для коллекции AllErrors. Код ниже поможет вам
(sender as HttpApplication).Context.AllErrors[0]
Если в вашем коде есть какая-то ошибка, он не может пропустить это событие. Это определенно будет пойман здесь.
Всего наилучшего
Чтобы быть тупым, используйте ORM как LLBLGen Pro
Вам не нужно изобретать велосипед, когда дело доходит до доступа к базе данных. Это поможет вашему коду быть поддерживаемым и уменьшит вероятность появления ошибок из-за написания вашего собственного доступа к БД.