2016-02-28 82 views
0

网站都能够运行,但未经处理的,当我尝试登录到该网站,我得到这个错误:SQL异常是由用户代码

SQL Exception was unhandled by user code

在这条线=>

catch (SqlException e) 
{ 
    throw e; 
} 

以下是我的登录码DBmanager

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Collections; 
using System.Data.SqlClient; 
using System.Configuration; 

namespace TopJobAgencyApp.Class 
{ 
    public class DBManager 
    { 
     public static int InsertLogin(Registration u) 
     { 
      int rowsinserted = 0; 

      SqlConnection conn = null; 

      try 
      { 
       conn = new SqlConnection(); 
       conn.ConnectionString = ConfigurationManager.ConnectionStrings["TopJobdb"].ConnectionString; 
       conn.Open(); 

       SqlCommand comm = new SqlCommand(); 
       comm.Connection = conn; 
       comm.CommandText = "INSERT INTO topJobUser(username, email, password)" + 
            " VALUES (@username, @email, @password)"; 
       comm.Parameters.AddWithValue("@username", u.UserName); 
       comm.Parameters.AddWithValue("@email", u.Email); 
       comm.Parameters.AddWithValue("@password", u.Password); 

       rowsinserted = comm.ExecuteNonQuery(); 
      } 
      catch (SqlException e) 
      { 
       throw e; 
      } 

      return rowsinserted; 
     } 
    } 
} 

以下图片为错误讯息 enter image description here

+3

您正在捕获一个SqlException并再次抛出它。你需要处理它。 – Flaugzig

+1

请显示错误消息'e.Message' –

+1

知道InnerException消息以解决实际问题将是有趣的 – Steve

回答

-2

首先,如果你想处理异常,你不应该“抛出”错误。异常处理的想法是“处理”异常,而不是崩溃你的应用程序。

你在这里做的是你正在捕捉异常并将其扔回去。

您应修改代码以显示友好的错误消息,并调查异常消息以及可能存在的其他内部异常。

您创建的异常对象,你会发现很多有用的信息存储在它的属性中。你应该探索Source,Message,Inner Exceptions等。

其次,从你的错误信息看来,登录凭证似乎是错误的。确保你的用户名和密码是正确的。另外,检查连接字符串是否正确。

您也可以在执行过程中设置断点并检查您的代码。

+1

可以在异常后崩溃应用程序。只有在知道异常后才能处理异常,如何在异常后恢复应用程序状态,否则异常不会被捕获。此外,显示错误消息不是通用的解决方案。 – Dennis

+0

我不知道你有什么想法可以使应用程序崩溃。但我想你需要做一些编程并正确学习错误处理。您需要随时处理异常情况。作为开发人员来处理应用程序状态以及用户将看到的内容取决于您。例如,对于Web应用程序,您可以向用户显示友好的错误消息,然后向开发人员发送详细信息,而不是“崩溃”应用程序。或者将错误记录在某处供以后参考。阅读关于异常处理以进一步加强您的知识。 – Yousi

0

唯一的例外是相当清楚的:

Login failed for user 'user'.

这意味着,连接字符串相关的用户没有登录的权限问题的SQL服务器。

可能的解决

  1. 验证用户登录权限到SQL Server,然后验证连接字符串中的凭据。

  2. 如果您在IIS下使用Windows身份验证,则需要将身份验证模式设置为Windows(请参阅下面的示例)。

  3. 如果使用实体框架(基于示例代码,您没有),那么您可能需要从连接字符串中删除Integrated Security=True;并可能从连接字符串中删除User Instance=True。适用于Windows的验证模式

样品的web.config:

<system.web> 
    <authentication mode="Windows"/> 
</system.web> 

让我们聊聊发布代码有点...

返回类型

public static int InsertLogin(Registration u) 

什么是返回一个int的目的是什么?使用ExecuteNonQuery时,结果是受影响的行的总数,其中可能包含插入触发器影响的行。在大多数情况下,插入方法应该返回新插入的行的标识或插入的实际新实体。

处置连接

conn = new SqlConnection(); 

的SqlConnection的(一样的SqlCommand)实现IDisposible所以你要使用using语句来轻松关闭/处置连接。

的try/catch

try 
{ 
    // sql 
} 
catch (SqlException e) 
{ 
    throw e; 
}  

什么是醒目,然后抛出没有任何异常处理的钱包?即日志记录,重试等...无论如何,如果需要重新排除异常,那么只需使用throw;通过使用throw e你正在丢失堆栈跟踪。

添加参数

comm.Parameters.AddWithValue("@username", u.UserName); 

虽然AddWithValue工作,它是一个更好的做法与定义的类型添加参数。有关更多信息,请参阅Can we stop using AddWithValue() already?

重构

现在,我们的一些背景,该方法可以清理:

// not ideal, but let's hold the connection string in a backing field 
// would be better if the connection string could be passed in at runtime 
// instead of the data access layer needing direct access to the config file 
private static readonly string ConnString = ConfigurationManager.ConnectionStrings["TopJobdb"].ConnectionString; 

public static void InsertLogin(Registration u) 
{ 
    using (var conn = new SqlConnection(ConnString)) 
    using (var cmd = new SqlCommand() 
    { 
     cmd.Connection = conn; 
     cmd.CommandText = "INSERT INTO topJobUser(username, email, password) VALUES (@username, @email, @password)"; 

     // be sure to set the size value correctly 
     cmd.Parameters.Add("@username", SqlDbType.VarChar, 100).Value = u.UserName; 
     cmd.Parameters.Add("@email", SqlDbType.VarChar, 100).Value = u.Email; 
     cmd.Parameters.Add("@password", SqlDbType.VarChar, 100).Value = u.password; 

     conn.Open(); 

     cmd.ExecuteNonQuery(); 
    } 
} 

注:

  • 没有try/catch语句,因为没有什么可以从中恢复,并且没有其他异常处理是b经管理。
  • 该方法返回void,因为返回的行数不会向消费者提供任何信息。
  • 如果您想要返回插入的行的标识,有几个例子可以搜索。