该网站能够运行,但当我尝试登录该网站时,我收到此错误:
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
答案 0 :(得分:0)
例外很清楚:
用户'user'登录失败。
这意味着与连接字符串关联的用户没有相关SQL Server的登录权限。
可能的解决方案:
验证用户是否具有SQL Server的登录权限,然后验证连接字符串中的凭据。
如果您在IIS下使用Windows身份验证,则需要将身份验证模式设置为Windows(请参阅下面的示例)。
如果使用Entity Framework(基于示例代码,则不是),那么您可能需要从连接字符串中删除Integrated Security=True
;并且可以从连接字符串中删除User Instance=True
。
用于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();
}
}
注意:
答案 1 :(得分:-2)
首先,如果你想处理异常,你不应该&#34;抛出&#34;错误。异常处理的想法是&#34;处理&#34;异常,不会导致您的应用崩溃。
你在这里做的是你正在捕捉异常并将其丢回。
您应修改代码以显示友好的错误消息,并调查异常消息以及可能存在的任何其他内部异常。
您创建的异常对象,例如:您会在其属性中找到许多有用的信息。你应该探索源,消息,内部异常......等等。
其次,从您的错误消息中,似乎登录凭据是错误的。确保您的用户名和密码正确无误。另外,检查连接字符串是否有序。
您还可以设置断点并在执行期间检查您的代码。