0

我有以下名为 searchit 的查询

SELECT 2 AS sourceID, BLOG_COMMENTS.bID, BLOG_TOPICS.Topic_Title,
    BLOG_TOPICS.LFD, BLOG_TOPICS.LC,
    BLOG_COMMENTS.Comment_Narrative
FROM BLOG_COMMENTS INNER JOIN BLOG_TOPICS
    ON BLOG_COMMENTS.bID = BLOG_TOPICS.bID
WHERE  (BLOG_COMMENTS.Comment_Narrative LIKE @Phrase)

此查询执行并在查询生成器中返回正确的结果!但是,查询需要在代码隐藏中运行,所以我有以下行:

DataTable blogcomments = btad.searchit(aphrase);

在任何一个表中的任何列的任何行中都没有空字段。这些表足够小,我可以轻松检测到空数据。请注意,bID 是 blog_topics 的关键,而 cID 是博客评论的关键。

无论如何,当我运行它时,我会收到以下错误:

无法启用约束。一行或多行包含违反非空、唯一或外键约束的值。

表格具有 1 x N 的关系,每个博客条目都有许多评论。如果我使用 DISTINCT 运行查询并从返回字段中删除 Comment_Narrative,它会正确返回数据(但我需要其他行!)但是,当我返回其他行时,出现上述错误!

我想告诉我返回表上有一个我没有放在那里的约束,因此它必须以某种方式从对查询本身的调用继承该约束,因为其中一个表恰好定义了一个主键(它一定有)。但是为什么查询在查询构建器中工作正常?查询构建器不关心结果中的 bID 是否被欺骗(它不应该如此),但代码隐藏确实关心。

附录:

就像测试一样,

  1. 我从退货列表中删除了投标,但仍然收到错误消息。
  2. 我从 blog_topics.bID 中删除了主键,我得到了同样的错误。

这有点告诉我,导致问题的不是我的投标被欺骗的事实。

另一个测试:我进入了设计器代码(我知道这很讨厌,我只是绝望)。我添加了以下内容:

    // zzz
    try
    {

        this.Adapter.Fill(dataTable);
    }
    catch ( global::System.Exception ex )
    {

    }

奇怪的是,当我运行它时,我得到与以前相同的错误并且它没有显示我在错误消息中所做的更改:

Line 13909:            }
Line 13910:            BPLL_Dataset.BLOG_TOPICSDataTable dataTable = new BPLL_Dataset.BLOG_TOPICSDataTable();
Line 13911:            this.Adapter.Fill(dataTable);
Line 13912:            return dataTable;
Line 13913:        }

我很难过......除非它看到我在 try catch 中没有做任何事情并且正在为我优化。

另一个附录:怀疑它忽略了我添加到设计器的测试代码,我添加了一些东西。它会产生相同的错误并且表现得好像它没有看到此代码。(好吧,它看不到这段代码,因为它在浏览器中打印出来的内容和以前一样。)

    // zzz
    try
    {

        this.Adapter.Fill(dataTable);
    }
    catch ( global::System.Exception ex )
    {
        System.Web.HttpContext.Current.Response.Redirect("errorpage.aspx");
    }

问题是,当我发布原始帖子时,我已经在尝试解决问题了。我不确定我能从兔子洞走多远。也许我将整个混乱读入 C# 并自己完成所有的连接和废话。我真的很讨厌这样做,因为我最近才改掉这个习惯,但我认为我正在尽善尽美地努力按照上帝和微软的意图使用这个工具。从智慧结束,tff。

4

2 回答 2

1

你并没有真正展示你是如何从 C# 运行这个查询的......但我假设或者作为 SqlCommand 中的直接文本,或者它正在由一些 ORM 完成......你是否尝试过将此查询编写为存储程序并这样称呼它?存储过程将更容易使用示例数据自行测试和运行。

鉴于错误提到空值这一事实,我假设,如果它是查询问题而不是代码的其他元素,那么它必须位于以下字段之一:BLOG_COMMENTS.bID BLOG_TOPICS .bID BLOG_COMMENTS.Comment_Narrative

如果这些字段中的任何一个为 Nullable,那么在将它们用于任何比较或加入之前,您应该对它们执行 COALESCE 或 ISNULL。正是这些情况解释了为什么大多数 DBA 喜欢在表中尽可能少地包含可空列 - 它们会导致开销并且容易出错。

如果这仍然不能解决您的问题,那么 COALESCE/ISNULL 所有可以为空且由该查询返回的字段。从等式中取出所有空值,然后让事情正常工作,然后,如果您确实需要空值为空,请返回并一次删除 COALESCE/ISNULL,直到找到罪魁祸首。

于 2012-02-29T13:20:26.933 回答
0

我的问题来自于无知和有点迟钝。我没有意识到仅仅因为字段是 sql 表中的键就意味着它必须是 tableadapter 中的键。如果在 SQL 表中定义了一个键字段,然后创建了一个表适配器,那么适配器中的相应字段也将是一个键。我所要做的就是取消设置 tableadapter 中的关键字段并且它起作用了。

解决方案:

  • 选择适配器中的关键字段。
  • 右键点击
  • 选择“删除密钥”(保留该字段,但删除“密钥”图标)

而已。

于 2012-03-16T15:15:50.670 回答