• 全部
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

编写了一个数据库层组件,使用Nunit测试完成,在Web页中使用却无效

daou101 2004-11-01 09:43:04
各位高手,今日遇到一个极端令我困惑的问题.
数据库操作层疑问:
我写了一个数据库访问层,比如ItemsDB就代表了所有Items表的操作,在Web页中,调用数据库中的存储过程实现相应功能.使用NUnit测试了组件的所有函数,均可以正确执行.
但是在Web页中:删除,添加功能都没有问题,更新却不起任何作用,程序不报错.
有谁遇到过类似的奇怪问题,探讨探讨啊.

//例如,页面有个"更新"按钮,单击后执行:

private void ButtonUpdate_Click(object sender, System.EventArgs e)
{
OA.Component.ItemsDB itemsDB=new OA.Component.ItemsDB();
itemsDB.UpdateItem(itemID,TextBoxItemName.Text,TextBoxItemUOM.Text,
Convert.ToDouble(TextBoxUP.Text));

Response.Redirect(ViewState["UrlReferrer"].ToString());

}

//ItemsDB可能象这样, 使用 GotDotNet.ApplicationBlocks


public void UpdateItem(string itemID,string itemName,string uom,double unitPrice)
{

helper.ExecuteNonQuery(connectionString,"dbo.Items_UpdateItem",new object[]{itemID, itemName, uom, unitPrice});

}

...全文
213 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jinglelin 2004-11-02
单步调试一下,如果只是更新不行的话,检查你的更新时间有没有被调用,丢失事件的情况经常出现的.
this.btn_Update.Click += new System.EventHandler(this.btn_Update_Click);
回复
daou101 2004-11-02
多谢各位老大了.
我跟踪了一下,原来是ItemID没有传值进去的缘故.我再隐藏代码页,申明了一个私有的string itemID;
加载页面时他的值从查询字符串中获得.

但是,当单击页面上的更新按钮时,这个itemID已经不再存在了,为什么我真还不清楚,我只好吧itemID
存在Session中,这样就可以实现更新了.

回复
happyjun2000 2004-11-02
原来老大们都在这里^_^
回复
goody9807 2004-11-02
编写 NUnit 测试
作为示例,我将测试 .NET 框架中 Hashtable 类的功能,以确定是否可以添加两个对象并且随后检索这些对象。我的第一步是添加对 NUnit.Framework 程序集的引用,该程序集将赋予我对 NUnit 框架的属性和方法的访问权。接下来,我将创建一个类并用 TestFixture 属性标记它。该属性使 NUnit 可以知道该类包含 NUnit 测试:

using System;
using System.Collections;
using NUnit.Framework;

namespace NUnitExample
{
[TestFixture]
public class HashtableTest {
public HashtableTest() {

}
}
}

下一步,我将创建一个方法并用 [Test] 属性标记它,以便 NUnit 知道该方法是一个测试。然后,我将建立一个 Hashtable 并向其添加两个值,再使用 Assert.AreEqual 方法查看我是否可以检索到与我添加到 Hashtable 的值相同的值,如下面的代码所示:

[Test]
public void HashtableAddTest()
{
Hashtable ht = new Hashtable();

ht.Add("Key1", "Value1");
ht.Add("Key2", "Value2");

Assert.AreEqual("Value1", ht["Key1"], "Wrong object returned!");
Assert.AreEqual("Value2", ht["Key2"], "Wrong object returned!");
}

这将确认我可以首先向 Hashtable 中添加值并随后检索相应的值 — 这是一个很简单的测试,但能够表现 NUnit 的功能。存在许多测试类型以及各种 Assert 方法,可使用它们来测试代码的每个部分。

要运行该测试,我需要生成项目,在 NUnit 应用程序中打开生成的程序集,然后单击 Run 按钮。图 5 显示了结果。当我看到那个大的绿色条纹时,我有一种兴奋和头晕的感觉,因为它让我知道测试已经通过了。这个简单的示例表明 NUnit 和单元测试是多么方便和强大。由于能够编写可以保存的单元测试,并且每当您更改代码时都可以重新运行该单元测试,您不仅可以更容易地检测到代码中的缺陷,而且最终能够交付更好的应用程序。



图 5 NUnit

NUnit 是一个开放源代码项目,并且可以从 http://www.nunit.org 下载。还有一个优秀的 NUnit Visual Studio .NET 外接程序,它使您可以直接从 Visual Studio 中运行单元测试。您可以在 http://sourceforge.net/projects/nunitaddin 找到它。有关 NUnit 及其在测试驱动开发中的地位的详细信息,请参阅文章“Test-Driven C#: Improve the Design and Flexibility of Your Project with Extreme Programming Techniques”(MSDN ®Magazine 2004 年 4 月刊)。

回复
xueqs 2004-11-02
凑凑热闹
回复
marvelstack 2004-11-02
检查一下存储过程是否正常,先在查询分析器中执行更新一条记录是否能成功。
回复
ianok 2004-11-02
顶!
回复
saucer 2004-11-02
check the return value,

int n = helper.ExecuteNonQuery(connectionString,"dbo.Items_UpdateItem",new object[]{itemID, itemName, uom, unitPrice});

if (n==0)
{
//你输入的数据并没有产生相应的变化,因为WHERE部分不满足条件
}
回复
lhcoolhacker 2004-11-02
如果要实现在回发时仍能获取值,请将string itemID放在ViewState中即可
回复
孟子E章 2004-11-02
你的隐藏页怎么写的?如果不是标准控件的话,要自己处理状态维护的问题
回复
Seeko0 2004-11-02
SqlServer中使用探查器察看sql语句
或自己写code输出sql语句进行检查
回复
cancersyf 2004-11-01
看你的程序根本看不出问题在哪儿,好好检查helper.ExecuteNonQuery方法和调用的存储过程。首先确定你的存储过程没有问题,然后再检查ExecuteNonQuery方法,最好跟踪调试一下,实在不行把代码贴出来吧。
回复
孟子E章 2004-11-01
检查
helper.ExecuteNonQuery(connectionString,"dbo.Items_UpdateItem",new object[]{itemID, itemName, uom, unitPrice});

这个方法里面语句是否正确
回复
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2004-11-01 09:43
社区公告
暂无公告