0

我为讨论论坛网站编写了一个插入函数,用于在数据库中插入新的讨论线程。功能如下:

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 是错误的。谁能告诉我我的代码有什么问题?或者我如何检查为什么 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
4

5 回答 5

2

话虽如此,SQL Profiler 是您的朋友。从分析器中获取生成的 sql 并在 SQL mgmt studio 中运行它。我有 99% 的把握答案是显而易见的。如果没有,请使用分析器生成的 sql 更新您的答案,我们将从那里获取。

如果你需要一些关于 SQL Profiler 的指导,一个简单的谷歌搜索会带来很多选择:SQL Profiler Search

于 2012-04-27T16:15:57.470 回答
2
  • finally您应该在一个块中关闭您的连接。您之前遇到的任何异常都con.Close();将导致您的连接保持打开状态。这可能是这里的错误(取决于 的范围con

  • 您不应该吞下异常,而是记录它。然后您可以正确检查错误。如果您没有日志记录,请获取日志记录。但与此同时,请查看您使用调试器捕获的异常。

  • 您还应该捕获更具体的异常,以便您可以区分应用程序中的连接错误和慢性错误。检查您正在调用的方法可能会引发哪些异常。例如, 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是相同的。数据库值是否也相同,列是否都需要字符串?

于 2012-04-27T17:07:40.260 回答
1

你需要做一些基本的调试。设置您的代码,如:

catch(Exception ex)
{
  return -1;
}

返回时设置断点,看看异常是什么。

于 2012-04-27T16:14:34.477 回答
0

你可能没有达到int r=com.ExecuteNonQuery();代码。可能是con.Open();方法上的错误。

你能在你的 catch 中抛出一个新的异常并向我们展示实际的错误吗?

于 2012-04-27T16:16:25.473 回答
0

您当前代码的一个挑战是在几种不同的情况下返回“-1”:

  • 发生异常
  • getDesID 的结果为空
  • INSERT 语句插入行失败

检查这一点的一种简单方法是从每个故障点返回不同的数字(例如 -2 或 -3)。这样,您就可以确定错误出现的位置,而无需过多更改代码或附加调试器。

在我看来,问题不太可能出在您的 SQL INSERT 语句上——如果该语句本身无效或违反了数据库约束,SQL Server 会向您返回一个异常,该异常将被您的异常处理程序捕获。

于 2012-04-27T16:53:47.380 回答