用户代码未处理Sql Exception

时间:2016-02-28 09:17:09

标签: c# sql-server

该网站能够运行,但当我尝试登录该网站时,我收到此错误:

  

SQL异常未被用户代码

处理

在这一行=>

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

2 个答案:

答案 0 :(得分:0)

例外很清楚:

  

用户'user'登录失败。

这意味着与连接字符串关联的用户没有相关SQL Server的登录权限。

可能的解决方案

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

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

  3. 如果使用Entity Framework(基于示例代码,则不是),那么您可能需要从连接字符串中删除Integrated Security=True;并且可以从连接字符串中删除User Instance=True

  4. 用于Windows身份验证模式的示例web.config:

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

    让我们聊聊发布的代码......

    返回类型

    public static int InsertLogin(Registration u)
    

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

    处置连接

    conn = new SqlConnection();
    

    SqlConnection(和SqlCommand一样)实现了IDisposible,因此您需要使用using语句来轻松关闭/处理连接。

    <强> 尝试/捕获

    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,因为无法恢复,也没有其他异常处理。
    • 该方法返回void,因为返回的行数不会向使用者提供任何信息。
    • 如果要返回插入行的标识,可以搜索几个示例。

答案 1 :(得分:-2)

首先,如果你想处理异常,你不应该&#34;抛出&#34;错误。异常处理的想法是&#34;处理&#34;异常,不会导致您的应用崩溃。

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

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

您创建的异常对象,例如:您会在其属性中找到许多有用的信息。你应该探索源,消息,内部异常......等等。

其次,从您的错误消息中,似乎登录凭据是错误的。确保您的用户名和密码正确无误。另外,检查连接字符串是否有序。

您还可以设置断点并在执行期间检查您的代码。