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…取决于它找到的行数)。非常感谢您的帮助删除表中的所有行后重试。这将给你零。我在当地试过了,结果对方回答了你。