Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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(Sql命令)检查MS Sql中是否存在单个项的最佳方法_C#_Sql - Fatal编程技术网

C# 使用C(Sql命令)检查MS Sql中是否存在单个项的最佳方法

C# 使用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

我创建了一个执行查询的方法,我只需要知道它是否返回true或false

   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);
            }