Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查数据库中是否存在行_C#_Npgsql - Fatal编程技术网

C# 检查数据库中是否存在行

C# 检查数据库中是否存在行,c#,npgsql,C#,Npgsql,我有一个数据库,想检查一个特定的记录是否已经存在 string sql = "SELECT COUNT(*) from tbl_student WHERE email = '" + mail + "' AND telephone= '" + telephone + "'"; NpgsqlCommand command = new NpgsqlCommand(sql, conn); int userCount = (int)command.ExecuteScalar(); if (userCoun

我有一个数据库,想检查一个特定的记录是否已经存在

string sql = "SELECT COUNT(*) from tbl_student WHERE email = '" + mail + "' AND telephone= '" + telephone + "'";
NpgsqlCommand command = new NpgsqlCommand(sql, conn);
int userCount = (int)command.ExecuteScalar();
if (userCount > 0)
{
    lblMessage.Text = "Person already exists";
}
不工作的线路。错误消息说这是无效的强制转换。我不知道,请帮帮我

int userCount = (int)command.ExecuteScalar();

我怀疑问题在于它返回的是
long
或类似内容。尝试使用:

int userCount = Convert.ToInt32(command.ExecuteScalar());
如果这不起作用:询问它是什么:

object val = command.ExecuteScalar()
Debug.WriteLine(val.GetType().FullName);

command.ExecuteScalar()
将返回结果集中第一行的第一列,如果结果集为空,则返回null引用

它无法生成int值

像这样做

if(command.ExecuteScalar() != null){
lblMessage.Text = "Person already exists";
}

请试试这段代码

object s = sql.ExecuteScalar();
if (s != null)
{
    Console.WriteLine("Query returned value.");
}
else
{
    Console.WriteLine("Query returned nothing.");
}

谢谢你们的帮助。我试过你的许多建议,但都不管用。 然后我接受了huMpty duMpty建议并将其存储到一个var变量中。然后我将var类型转换为int

这是我现在的工作代码:

var result = command.ExecuteScalar();
int i = Convert.ToInt32(result);    
if (i == 0)
{
    lblMessage.Text = "Person does not exist";
}
else
{
    lblMessage.Text = "Person exists";
}

那里有一个漂亮的sql注入孔。这一点非常重要:不要将值连接到SQL中。使用参数。代码中的任何其他问题都是这个巨大问题的次要问题。坦率地说,代码没有成功运行是在帮你的忙。也许这是一种抗议。什么是commnad3?它应该是
command
,您没有听说过SqlInjection吗…@hassansar,如果您的意思是
null
:该场景会抛出一个NRE,而不是无效的强制转换
DBNull
抛出无效的强制转换,但是
select count(*)
不返回
DBNull
@student不真的,不;数据库中存在的数据与
数据集中存在的数据之间存在巨大差异。另外:除非又是2005年,否则您可能不应该使用
DataSet
@student。几乎任何替代方法都是非常可取的。ORMs和micro-ORMs使得将常规类映射到数据库概念变得非常简单。数据集的效率非常低,几乎总是使用不当,而且通常使用效率非常低。很少有需要使用数据集的场景,而这通常解决了临时报告/SQL工具无法预先预测列结构的问题。这是错误的。SELECT COUNT(*)如果不匹配则返回零。是的,这是正确的,我尝试了上面的代码,它总是返回一个数字(0,1,2…)。出于好奇:如果查询返回
long
value,为什么这个语句
(int)command.ExecuteScalar()不工作?这个语句可以将长值转换成整数,对吗?这里:你的回答帮助了我,Thanks@SudhakarTillapudi
(int)命令.ExecuteScalar()
是一个unbox操作;unbox必须是正确的类型(或者至少是:对于枚举,大小正确的类型)。不能将
long
取消装箱到
int
。但是,您可以执行
=(int)(long)command.ExecuteScalar()
-即,取消对
long
的装箱,然后将
long
强制转换为
int
。目前尚不清楚这有何帮助;从异常消息中,我们可以推断这不是一个
null
值(如果是这样的话,它应该是
NullReferenceException
),我没有清楚地理解您的问题。为什么会出现例外情况。如果行基于我们传递的SqlCommand存在,则sql.ExecuteScalar()将返回一个对象。它将返回null,以防数据库不包含行。对不起,我的回答太晚了。您的代码不工作,因为s从不为null(它始终具有值0、1、2…取决于它找到的行数)。非常感谢您的帮助删除表中的所有行后重试。这将给你零。我在当地试过了,结果对方回答了你。