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

SQL 插入查询在 c# 中不执行而不引发任何异常

  • 您应该在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 会向您引发异常,该异常将被您的异常处理程序捕获。