[英]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”:
一種簡單的檢查方法是從每個故障點返回不同的數字(例如-2或-3)。 這樣一來,您就可以確定發生錯誤的位置,而無需太多更改代碼或附加調試器。
在我看來,該問題不太可能是您的SQL INSERT語句-如果該語句本身無效或違反了數據庫約束,則SQL Server將向您引發一個異常,該異常將由您的Exception處理程序捕獲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.