求助,SQL不能插入重复的值

哨子 2010-12-05 09:27:36
这是C#中的错误提示:
不能在具有唯一索引 'IX_Urls' 的对象 'dbo.Urls' 中插入重复键的行。
语句已终止。

可是我己经做了重复查询:
private static bool IsHasValue(string selectstr)
{
SqlConnection conn = new Sql().CreateConnection();
conn.Open();
bool value = false;
SqlCommand cmd = new SqlCommand(selectstr, conn);
object obj = cmd.ExecuteScalar();
string s = obj.ToString();
if (obj.ToString() == "1")
value = true;
else
value = false;
conn.Close();
conn.Dispose();
cmd.Dispose();
return value;
}

结果明明同一句SQL语句(如:select * from Urls where UrlHref='http://www.baidu.com')在SQL查询器里能查到记录,但是在IsHasValue里却是返回false,以致于C#总是报错,怎么回事啊。
...全文
416 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
哨子 2010-12-18
  • 打赏
  • 举报
回复
这是正确的代码:
        private bool IsHasBooks(string selectstr)
{
SqlConnection conn = CreateConnection();
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = selectstr;
cmd.Connection = conn;
object result = cmd.ExecuteScalar();
conn.Close();
conn.Dispose();
cmd.Dispose();
bool value = false;
if (result == null)
return false;
else
return true;
}
king_827 2010-12-06
  • 打赏
  • 举报
回复
遇到这种奇怪的问题,应该先对各个关键点作单步调式.
上来问当然省事,但站于治学的态度.
应先自教而后求教.
king_827 2010-12-06
  • 打赏
  • 举报
回复
楼主:

SQL语句:select * from Urls where UrlHref='http://www.baidu.com'

if (obj.ToString() == "1")
value = true;
else
value = false;

这是逻辑设计缺憾.
-----------------------

下半部份应该和空值比较,不是和1比较.
如果记录数是2,同样返回的是False;
isgoodtime 2010-12-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 going1981 的回复:]
引用 5 楼 wuyq11 的回复:

唯一索引列,不允许出现重复的值。
查询是否重复


直接在数据库里限制比较好。
[/Quote]

不错,可以在数据库里限制,但你没看到人家已经在数据库里限制了这才引起程序报错吗

本人也是小菜一个,想在这里认识更多的IT朋友.鄙人QQ:40491931
isgoodtime 2010-12-06
  • 打赏
  • 举报
回复
互相学习中嘿嘿;
兄弟根据我的经验觉得是出在ExecuteScalar()这里,果然不出所料,错误就出在这里
老兄弟您对这个理解得不够所以就写出了错误的方法.下面是我在网上看到的资料


ExecuteScalar这个方法是从数据库中检索单个值返回值是object类型,必须用与它在数据库里存放的类型相同类型或者可以转换成的类型,比如数据是nchar类型值为 "123" 就可以用(int)ExecuteScalar(),如果数据是nchar类型值为 "abc"就不能用(int)ExecuteScalar(),就得写string result = ExecuteScalar().ToString

理解上面之后我又发现一个问题,就是如果为空时反回什么呢.我又上网查了资料如下:


SqlCommand.ExecuteScalar 方法

执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
命名空间:System.Data.SqlClient
程序集:System.Data(在 system.data.dll 中)

语法:
public override Object ExecuteScalar ()
返回值:
结果集中第一行的第一列或空引用(如果结果集为空)。


发现发题的所在,那么我们就来改你的代码吧,错误之处还请大家帮我提出来了


private static bool IsHasValue(string selectstr)
{
SqlConnection conn = new Sql().CreateConnection();
conn.Open();
bool value = false;
SqlCommand cmd = new SqlCommand(selectstr, conn);
object obj = cmd.ExecuteScalar();
//string s = obj.ToString();//这里多余了
if (obj != null)//if (obj.ToString() == "1")//错就错在这个判断了,嘿嘿
value = true;
else
value = false;
conn.Close();
conn.Dispose();
cmd.Dispose();
return value;
}
一只熊猫 2010-12-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyq11 的回复:]

唯一索引列,不允许出现重复的值。
查询是否重复
[/Quote]

直接在数据库里限制比较好。
wuyq11 2010-12-05
  • 打赏
  • 举报
回复
唯一索引列,不允许出现重复的值。
查询是否重复
wuyq11 2010-12-05
  • 打赏
  • 举报
回复
select count(*) from Urls where UrlHref='http://www.baidu.com'
ExecuteScalar第一行第一列数据
水妹妹 2010-12-05
  • 打赏
  • 举报
回复
object obj = cmd.ExecuteScalar();

这个改下看看

int obj = cmd.ExecuteScalar();
哨子 2010-12-05
  • 打赏
  • 举报
回复
改了,不知道怎么回事,还是有错。
51Crack 2010-12-05
  • 打赏
  • 举报
回复
select count(*) from Urls where UrlHref='http://www.baidu.com'

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧