奇怪的行为:ASP.NET到Sql Server

时间:2011-02-01 17:27:07

标签: c# asp.net sql iis windows-server-2003

行。所以在我问这里的问题之前是背景。 我刚刚通过了ASP.NET的开发阶段,并在LOCAL机器上创建了一个功能齐全的Web应用程序。因此,我将文件传输到要运行的Windows服务器上创建的IIS Web文件夹,以查看它是否应该运行。它确实!

所以问题是这个。当我输入信息时,我点击Button1然后我得到一个回发,这是正常的,如果你看看我的代码。我去使用Sql Server Management检查数据库,然后我看到了它......没有那个!!

以下是一些可以帮助您解决此问题的详细信息以及下面的代码。

具体细节:

  • Windows Server 2003
  • SQL Server 2005
  • .NET Framework 2.0
  • IIS 6

标记正确,文本框名称和所有内容

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

这就是代码。我甚至无法猜测问题可能在哪里,因为我没有收到任何错误消息。如果您需要更多信息,请与我们联系。我很乐意提供。

P.S。我通过IIS而不是ASP.NET开发服务器运行网站(如果我还没有提到它。所以,如果它在VS上的“浏览器中查看”中运行,那么我很乐意知道“)

修改

我要感谢大家的帮助。我遵循了你的大部分建议,我希望在我找出新问题(获得登录错误异常,YAY !!)后,我将能够在实践中使用你的评论。你们都会认为我是一个白痴(我现在觉得这是正确的),但我无法看到这些变化的原因是由于没有构建C#代码。我知道有些人提到了编译,但我认为它是编译的,因为任何时候我对标记进行了更改,它立即出现在网络中。我习惯于“在浏览器中查看”,以至于我忘记了Visual Studio自动编译代码(我认为)

5 个答案:

答案 0 :(得分:2)

我首先想要的是在代码中添加一些工具。最简单的方法是添加一些跟踪。这将确保事件正确连接并正确触发事件。如果您没有在跟踪中看到按钮单击被触发,那么您有一个UI问题并且可以专注于它。最常见的是没有正确设置@ Page指令,但还有其他可能的原因。

排除故障的下一步是尽可能分析您要攻击的服务器。希望您没有直接部署到生产环境中,并且您可以使用此暂存环境。

我的最后一步是重构UI层中的实际数据代码并创建一个可测试的“存储库”(无论您是否使用存储库模式 - 引用的原因)。然后,您可以使用测试包围代码,并确保代码正常工作。您仍然需要跟踪以确保正在调用库并正确连接事件,但是分离关注点可以让您更好地处理数据访问代码的问题。

好的,不是最终的。您需要从代码中获取魔术字符串并将其移动到属于它们的配置中。硬编码==坏juju。

希望这有帮助!

答案 1 :(得分:1)

如果您确定该事件正在触发,那么最可能的原因是您使用了集成安全性。请记住,ASP.NET进程不等同于您的个人登录。集成安全性仅在您通过已在数据库中明确指定了帐户的帐户或组(例如管理员)登录并访问数据库时才有效。这里唯一的疑问是,当您尝试连接时,您没有收到错误。

不要试图让IIS_IUSRS帐户访问数据库 - 这是一个麻烦的邀请。而是在登录字符串中使用具有适当且安全密码的SQL Server帐户。这样,您就不必担心IIS_IUSRS相对于您的数据库的状态。

作为旁注,您将很快非常厌倦明确地打开连接,设置命令,添加参数等。我强烈建议您采用商业ORM,或者更好然而,实现一个轻量级的数据访问层,可以自动完成大部分繁重的工作。

答案 2 :(得分:1)

最简单的解释是你只是碰到了错误的数据库。否则你应该看到一些错误。你不是默默地捕捉异常吗?

答案 3 :(得分:0)

您的代码似乎很好。你在问题中提到你没有得到任何例外,你的代码也没有用。也许你可以尝试这样做,这样你至少可以捕获任何异常,如果你的代码中有可能会无声地导致问题。

将Global.asax文件添加到Web项目并向其添加Application_Error事件。以下是相同

的签名
protected void Application_Error(object sender, EventArgs e)
{
}

这是一个将捕获Web项目中的任何异常的事件,无论项目中发生异常的位置如何。一旦达到断点,检查发件人对象的AllErrors集合。以下代码可以帮助您

(sender as HttpApplication).Context.AllErrors[0]

如果您的代码中存在某些错误,则无法传递此事件。肯定会被抓到这里。

一切顺利

答案 4 :(得分:-1)

要生硬,使用ORM ,例如LLBLGen Pro

在数据库访问方面,您无需重新发明轮子。它可以帮助您的代码维护,并减少因编写自己的数据库访问而引入错误的机会。