C# 使用C(Sql命令)检查MS Sql中是否存在单个项的最佳方法
我创建了一个执行查询的方法,我只需要知道它是否返回true或falseC# 使用C(Sql命令)检查MS Sql中是否存在单个项的最佳方法,c#,sql,C#,Sql,我创建了一个执行查询的方法,我只需要知道它是否返回true或false public bool CheckData(string sql) { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["FabFlabs"].ToString()); con.Open(); SqlCommand cmd = new SqlCommand(s
public bool CheckData(string sql)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["FabFlabs"].ToString());
con.Open();
SqlCommand cmd = new SqlCommand(sql, con);
cmd.ExecuteNonQuery();
con.Close();
bool setYN =?
return setYN ;
}
查询类似于从管理员处选择电子邮件,其中电子邮件=
是否有更好的方法来构造查询?请尝试使用“选择存在”,并将查询放在括号内
SELECT EXISTS(your query)
ref:对于SELECT语句,只执行您的命令。它没什么用了
对于UPDATE、INSERT和DELETE语句,返回值为
受命令影响的行数。当触发器存在于
在插入或更新表时,返回值包括数字
受插入或更新操作和编号影响的行数
受一个或多个触发器影响的行数。对于所有其他类型的
语句,返回值为-1
您可以使用和使用方法稍微更改查询
我也喜欢。由于ExecuteScalar返回对象,您可以很容易地用
cmd.ExecuteScalar() != null
我同意这些评论,使用or将比COUNT更简单。我目前注意到的是sql显然没有参数化。这对我来说是一个巨大的警钟,应该立即修复。第二点是,您没有正确使用,当您的查询明显。。。询问 因此,更好的检查方法是:
public bool CheckData(string sql)
{
using(var con = CreateConnection())
using(var cmd = new SqlCommand(sql, con))
{
// ADD PARAMETERS
con.Open();
return cmd.ExecuteScalar() != null; // checks for a row
}
}
但是,;传递参数并不容易。我强烈建议使用像dapper这样的工具,即完全删除您的CheckData方法。考虑:
bool haveEmail;
string email = /* TODO; for example, "admin@example.com" */
using(var conn = CreateConnection())
{
haveEmail = conn.Query<int>(
"select top 1 1 from Admin where email=@email",
new { email }).Any(); // regular LINQ over IEnumerable<T>
}
简单、干净、完全参数化、高效。以下是我检查数据是否存在的方法
int q = 0;
bool NewCity = true;
MainWindow.cmdSel = new SqlCommand("SELECT COUNT(*) FROM DBO.Cities t WHERE t.Name=@Name", MainWindow.conn);
MainWindow.cmdSel.Parameters.Add("@Name", SqlDbType.NVarChar);
MainWindow.cmdSel.Parameters["@Name"].Value = Name;
try
{
q = (int)MainWindow.cmdSel.ExecuteScalar();
if (q > 0)
{
NewCity = false;
MessageBox.Show("City exists", "Warning");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
我个人更喜欢ExecuteScalar和SELECT TOP 1 NULL。。。然后检查null与DBNull.Value。这就节省了SQL Server的实际计数。COUNTemail可能是一个非常难看的解决方案:如果Admin表中有很多,比如100000 emals=,该怎么办?通常情况下,尤其是在电子邮件上并没有索引的情况下,打开光标并尝试从中读取内容是非常困难的it@ta.speot.is是的,你和Dmitry Bychenko的建议似乎更好更简单。补充我的答案。非常感谢。
int q = 0;
bool NewCity = true;
MainWindow.cmdSel = new SqlCommand("SELECT COUNT(*) FROM DBO.Cities t WHERE t.Name=@Name", MainWindow.conn);
MainWindow.cmdSel.Parameters.Add("@Name", SqlDbType.NVarChar);
MainWindow.cmdSel.Parameters["@Name"].Value = Name;
try
{
q = (int)MainWindow.cmdSel.ExecuteScalar();
if (q > 0)
{
NewCity = false;
MessageBox.Show("City exists", "Warning");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}