2017-04-06 136 views
0

我有一个表单,您可以在其中输入您的电子邮件,然后收到重置密码的指示。它有一个文本框(txtEmail),一个提交按钮(btnResetPassword)和一个lblMessage无法解决“在System.Data.dll中发生类型'System.Data.SqlClient.SqlException'的异常,但未在用户代码中处理”

我的C#代码如下所示:

protected void btnResetPassword_Click(object sender, EventArgs e) 
{ 
    string CS = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

    using (SqlConnection con = new SqlConnection(CS)) 
    { 
     SqlCommand cmd = new SqlCommand("spResetPassword", con); 
     cmd.CommandType = CommandType.StoredProcedure; 

     SqlParameter paramEmail = new SqlParameter("@Email", txtEmail.Text); 
     cmd.Parameters.Add(paramEmail); 

     con.Open(); 

     SqlDataReader rdr = cmd.ExecuteReader(); 

     while (rdr.Read()) 
     { 
      if (Convert.ToBoolean(rdr["ReturnCode"])) 
      { 
       SendPasswordResetEmail(rdr["Email"].ToString(), rdr["UniqueId"].ToString()); 
       lblMessage.Text = "An email with instructions to reset your password is sent to your registered email"; 
      } 
      else 
      { 
       lblMessage.ForeColor = System.Drawing.Color.Red; 
       lblMessage.Text = "Username not found!"; 
      } 
     } 
    } 
} 

然后我有一个方法SendPasswordResetEmail(string email, string ID)的正常工作(SMTP)。

存储过程是:

CREATE PROC Spresetpassword @Email NVARCHAR(100) 
AS 
BEGIN 
    DECLARE @UserId INT 

    SELECT @UserId = id 
    FROM dbo.turiststbl 
    WHERE email = @Email 

    IF (@UserId IS NOT NULL) 
    BEGIN 
     --If username exists 
     DECLARE @GUID UNIQUEIDENTIFIER 

     SET @GUID = Newid() 

     INSERT INTO tblresetpasswordrequests (id, userid, resetrequestdatetime) 
     VALUES (@GUID, @UserId, Getdate()) 

     SELECT 
      1 AS ReturnCode, 
      @GUID AS UniqueId, 
      @Email AS Email 
    END 
    ELSE 
    BEGIN 
     --If username does not exist 
     SELECT 
      0 AS ReturnCode, 
      NULL AS UniqueId, 
      NULL AS Email 
    END 
END 

当我进入我的电子邮件,我得到以下错误:

See Screenshot Here

我能做些什么?
编辑:数据库文件是不是本地的,他们是一个远程服务器

+0

看来你有一个数据库连接字符串问题。你能提到当前的数据库连接字符串? –

+0

从web.config文件中: @TetsuyaYamamoto – concretejungle

+0

请不要发布错误消息的屏幕截图。说:“将异常的详细信息复制到剪贴板”?单击它,并将消息发布到您的问题 –

回答

0

从连接字符串的问题根源的web.config文件中的:

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB; 
    AttachDbFilename=|DataDirector‌​y|\aspnet-Vizito-201‌​70305102044.mdf; 
    Init‌​ial Catalog=aspnet-Vizito-20170305102044; 
    Integrated Security=True" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

在这里,我们试图通过提使用LocalDb实例AttachDbFilename连接字符串属性的参数,并且它不应该在同一个字符串上使用Initial Catalog参数。

因此,通过移除Initial Catalog部分,连接字符串应该是这样的:

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB; 
    AttachDbFilename=|DataDirector‌​y|\aspnet-Vizito-201‌​70305102044.mdf; 
    Integrated Security=True" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

此外,如果数据库文件放在App_Data目录外的项目中,你可能需要完整的文件路径指其位置,因为这:

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB; 
    AttachDbFilename=C:\Users\Hp-Pc\Desktop\VizitoSiteMaster\Vizito\App_Data\aspn‌​et-Vizito-2017030510‌​2044.mdf; 
    Integrated Security=True" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

更新:

据OP解释说,DB发生在远程服务器实例,连接字符串应该使用Initial Catalog这样的:

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=[server address]; 
    Init‌​ial Catalog=aspnet-Vizito-20170305102044; User Id=[user ID]; Password=[password]; 
    Integrated Security=SSPI" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

注:与远程服务器IP地址替换[server address](与是否存在端口),[user ID] & [password]在远程服务器上使用用户凭据。

参考文献:

SQL Server Connection String

Cannot attach the file *.mdf as database

An attempt to attach an auto-named database for file ....database1.mdf failed

+0

对不起,我应该提到数据库不是本地的。它位于远程服务器上,因此app_data文件夹为空。正如我所看到的,我的项目文件夹中没有.mdf文件 – concretejungle

+0

如果数据库位于远程服务器中,请避免使用LocalDb实例,使用Initial Catalog并根据服务器地址和数据库名称放置连接字符串。但是如果将来有人遇到同样的问题,我会留下'LocalDb'问题的解释。 –

+0

好!我实际上通过键入SqlConnection con = new SqlConnection(“Data Source = myServerAddress; Initial Catalog = myDataBase; User Id = myUsername; Password = myPassword;”)来修复问题; 而不仅仅是SqlConnection conn = new SqlConnection(CS);谢谢@TetsuyaYamamoto – concretejungle

相关问题