SQL 插入查询在 c# 中不执行而不引发任何异常
本文关键字:任何 异常 执行 SQL 查询 插入 | 更新日期: 2023-09-27 18:32:32
我为一个论坛网站编写了一个插入函数,用于在数据库中插入新的讨论线程。函数如下:
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,并由调用函数检查,然后调用函数显示错误。问题是此插入函数未执行查询。当我检查值是否作为参数正确传递给 AddWithValue 函数时,我发现每个值都按照 asp.net 页面上给出的值传递。但是当控制来到com时。ExecuteNonQuery(( 函数。它返回 -1 是错误。谁能告诉我我的代码有什么问题?或者我如何检查为什么来。执行非查询(( 不返回任何受影响的行??<小时 />此异常显示
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
-
您应该在
finally
块中关闭连接。您在con.Close();
之前遇到的任何异常都将导致您的连接保持打开状态。这可能是这里的错误(取决于con
的范围( -
您不应该吞下异常,而是记录它。然后,您可以正确检查错误。如果没有日志记录,请获取日志记录。但与此同时,请查看使用调试器捕获的异常。
-
您还应该捕获更具体的异常,以便可以区分应用程序中的连接错误和慢性错误。检查您正在调用的方法可能会引发哪些异常。例如,骗局。Open(( 可以抛出这些:
SqlException
InvalidOperationException
所以先抓住那些,最后抓住Exception
。
根据异常的类型,您可以返回不同的错误代码和/或以不同的严重性级别进行记录。
此外,找出一种方法(使用分析或只是复制+粘贴(对数据库运行该查询,看看会发生什么。例如,您确定这部分是正确的:
com.Parameters.AddWithValue("@date",
SqlDateTime.Parse(DateTime.Now.ToString()));
com.Parameters.AddWithValue("@time",
SqlDateTime.Parse(DateTime.Now.ToString()));
@date
和@time
是相同的。数据库值是否也相同,并且列都需要字符串吗?
话虽如此,SQL 事件探查器是你的朋友。从探查器中获取生成的 sql,并在 SQL 管理工作室中运行它。我有99%的信心答案是显而易见的。如果没有,那么请使用从探查器生成的 sql 更新您的答案,我们将从那里获取答案。
如果您需要有关 SQL 事件探查器的一些指导,一个简单的 Google 搜索会显示许多选项: SQL 事件探查器搜索
您需要执行一些基本的调试。 像这样设置您的代码:
catch(Exception ex)
{
return -1;
}
在返回时设置断点,并查看异常是什么。
您可能没有到达int r=com.ExecuteNonQuery();
代码。可能是con.Open();
方法上的错误。
你能在你的捕获中抛出一个新的异常并向我们展示实际的错误吗?
当前代码的一个挑战是在几种不同的场景中返回"-1":
- 发生异常
- getDesID 的结果为空 插入
- 语句无法插入行
检查这一点的一种简单方法是从每个故障点返回一个不同的数字(例如 -2 或 -3(。这样,您可以确定引发错误的位置,而无需对代码进行太多更改或附加调试器。
在我看来,问题不太可能出在您的 SQL INSERT 语句上 - 如果该语句本身无效或违反了数据库约束,SQL Server 会向您引发异常,该异常将被您的异常处理程序捕获。