2017-04-06 43 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

相關問題