簡體   English   中英

SQL插入查詢未執行而未在C#中引發任何異常

[英]SQL Insert Query not executing without throwing any exception in c#

我為論壇論壇網站編寫了一個插入函數,用於在數據庫中插入新的討論線程。 功能如下:

public int createDiscuss(Discussion dis)
    {
        query = "insert into [MyForums].[dbo].[Discussions](desid, text, date, time, replyto, uid, isPrivate) values(@id, @text, @date, @time, @replyto, @uid, @pvp)";
        string did=getDesID();
        if (did == null)
            return -1;
        try
        {
            com = new SqlCommand(query, con);
            com.Parameters.AddWithValue("@id", did); 
            com.Parameters.AddWithValue("@text", dis.gettext()); 
            com.Parameters.AddWithValue("@date", SqlDateTime.Parse(DateTime.Now.ToString())); 
            com.Parameters.AddWithValue("@time", SqlDateTime.Parse(DateTime.Now.ToString()));
            com.Parameters.AddWithValue("@replyto", dis.getreplyto());
            com.Parameters.AddWithValue("@uid", dis.getuid());
            if (dis.IsPrivate() == false)
            { com.Parameters.AddWithValue("@pvp", 1); }
            else
            { com.Parameters.AddWithValue("@pvp", 2);  }
            con.Open();
            int r=com.ExecuteNonQuery();
            if (r <= 0)
            {
                return -1;
            }
            con.Close();

        }
        catch (Exception)
        {
            return -1;
        }
        return 0;
    }

如果遇到錯誤或異常,此函數將返回-1,並由調用函數進行檢查,然后調用函數顯示錯誤,則該函數將返回-1。 問題在於此插入功能未執行查詢。 當我檢查值是否正確傳遞給AddWithValue函數作為參數時,我發現每個值都按asp.net頁上給出的值傳遞。 但是當控制權轉到com.ExecuteNonQuery()函數時。 它返回-1,這是錯誤。 誰能告訴我我的代碼有什么問題嗎? 或如何檢查com.ExecuteNonQuery()為什么不返回任何受影響的行?


此異常顯示

 A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll An exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code 

話雖如此,SQL Profiler是您的朋友。 從探查器中獲取生成的sql並在SQL mgmt studio中運行它。 我有99%的信心,答案將很明顯。 如果不是,請使用從事件探查器生成的sql更新您的答案,然后從那里獲取答案。

如果您需要有關SQL Profiler的一些指導,簡單的Google搜索會帶來很多選擇: SQL Profiler搜索

  • 您應該在finally塊中關閉連接。 您在con.Close();之前遇到的任何異常con.Close(); 將導致您的連接保持打開狀態。 這可能是這里的錯誤(取決於con的范圍)

  • 您不應吞下該異常,而應將其記錄下來。 然后,您可以正確檢查錯誤。 如果您沒有日志記錄,請獲取日志記錄。 但是與此同時,請查看使用調試器捕獲的異常。

  • 您還應該捕獲更多特定的異常,以便可以分辨出連接錯誤和應用程序中的長期錯誤之間的區別。 檢查您正在調用的方法可能拋出哪些異常。 例如,con.Open()可以拋出以下內容:

SqlException

InvalidOperationException

因此,首先捕獲那些Exception最后捕獲Exception

根據異常的類型,您可以返回不同的錯誤代碼和/或以不同的嚴重性級別記錄日志。


另外,找出一種方法(使用性能分析或僅復制+粘貼)以對數據庫運行該查詢,並查看會發生什么情況。 例如,您確定這部分是正確的:

        com.Parameters.AddWithValue("@date",
            SqlDateTime.Parse(DateTime.Now.ToString())); 
        com.Parameters.AddWithValue("@time",
            SqlDateTime.Parse(DateTime.Now.ToString()));

@date@time相同。 數據庫值是否也相同,並且列都需要字符串嗎?

您需要進行一些基本的調試。 設置代碼如下:

catch(Exception ex)
{
  return -1;
}

在返回時設置一個斷點,並查看異常是什么。

您可能未達到int r=com.ExecuteNonQuery(); 碼。 可能是con.Open();上的錯誤con.Open(); 方法。

您能否在捕獲中拋出一個新異常並向我們顯示實際錯誤?

當前代碼的一個挑戰是在幾種不同的情況下返回“ -1”:

  • 發生異常
  • getDesID的結果為null
  • INSERT語句無法插入行

一種簡單的檢查方法是從每個故障點返回不同的數字(例如-2或-3)。 這樣一來,您就可以確定發生錯誤的位置,而無需太多更改代碼或附加調試器。

在我看來,該問題不太可能是您的SQL INSERT語句-如果該語句本身無效或違反了數據庫約束,則SQL Server將向您引發一個異常,該異常將由您的Exception處理程序捕獲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM