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

时间:2014-05-15 08:10:48

标签: c# sql

我创建了一个执行查询的方法,我只需要知道它是返回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 email from Admin where email = '' 有没有更好的方法来构建查询?

4 个答案:

答案 0 :(得分:5)

我目前注意到的事情是sql显然没有参数化。那对我来说是一个巨大的警钟,应立即修复。作为次要问题,您并非using正确,并且当您的查询显然是...查询时,您正在使用ExecuteNonQuery

然后,更好的检查是:

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

简单,干净,完全参数化,高效。

答案 1 :(得分:2)

对于SELECT语句,ExecuteNonQuery只执行您的命令。它没有做更多的事情。

  

对于UPDATE,INSERT和DELETE语句,返回值为   受命令影响的行数。当a上存在触发器时   正在插入或更新的表,返回值包括数字   受插入或更新操作影响的行数和数字   受触发器或触发器影响的行数。 适用于所有其他类型的   语句,返回值为-1

您可以使用COUNT()稍微更改一下您的查询,并使用ExecuteScalar方法。

using(SqlConnection con = new SqlConnection(ConString))
using(SqlCommand cmd = con.CreateCommand())
{
   cmd.CommandText = "select COUNT(email) from Admin where email = @email";
   cmd.Parameters.AddWithValue("@email", string.Empty);
   con.Open();
   int count = (int)cmd.ExecuteScalar();

   bool b; 
   if(count > 0)
      b = true;
   else
      b = false;
}

我也喜欢Marc's solution。由于ExecuteScalar会返回object,因此您可以轻松地检查它是否为null;

cmd.ExecuteScalar() != null

我同意这些评论,使用TOP 1EXIST会更简单,而不是COUNT

答案 2 :(得分:1)

尝试在括号内使用选择存在和您的查询。

SELECT EXISTS(your query)

参考:Best way to test if a row exists in a MySQL table

答案 3 :(得分:1)

以下是检查数据是否存在的方法

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