【问题标题】:If the SELECT SQL Server value is null, the query takes 5 minutes C #如果 SELECT SQL Server 值为 null,则查询需要 5 分钟 C#
【发布时间】:2019-12-30 20:02:52
【问题描述】:

我有一个非常愚蠢的问题。我正在做一个选择,我希望当值为空时,返回一个空字符串。当sql查询中有值时,查询一切正常,但如果查询中没有任何内容,我必须给sqlCommand.CommandTimeout大于300,但有时会超时。对此有解决方案吗?

public string TesteMetodo(string codPess)
    {
        var vp = new Classe.validaPessoa();
        string _connection = vp.conString();
        string query = String.Format("SELECT COUNT(*) FROM teste cliente WHERE cod_pess = {0}", codPess);
        try
        {
            using (var conn = new SqlConnection(_connection))
            {
                conn.Open();
                using (var cmd = new SqlCommand(query, conn))
                {

                    SqlDataReader dr = cmd.ExecuteReader();
                    if(dr.HasRows)
                        return "";
                    return codPess;
                }
            }
        }

【问题讨论】:

  • 当查询返回行时,您将返回一个空字符串。因为它是COUNT,所以它总是返回一行:计数。我猜你想知道返回的实际计数,而不是查询返回的行(总是一行),对吧?
  • cod_pes的种类是什么?
  • 根据您的标签,您正在使用 SQL-Server。针对表名中包含空格的表的 SQL 查询需要特别注意。请改用SELECT COUNT(*) FROM [teste cliente] WHERE ...。除此之外,@Andrew 是正确的……您将始终返回一个空字符串。
  • 请阅读参数化查询。没有使用String.Format。

标签: c# sql-server ado.net


【解决方案1】:

您可能应该在 UI 中进行验证并传递一个整数。

您可以将 usings 组合到一个块中。缩进更少,更易于阅读。

始终使用参数使查询更易于编写并避免 Sql Injection。我不得不猜测 SqlDbType 所以,检查你的数据库的实际类型。

在 .Execute 之前不要打开连接。由于您只检索单个值,因此您可以使用 .ExecuteScalar。 .ExecuteScalar 返回一个 Object,因此必须转换为 int。

    public string TesteMetodo(string codPess)
    {
        int codPessNum = 0;
        if (!Int32.TryParse(codPess, out codPessNum))
            return "codPess is not a number";
        var vp = new Classe.validaPessoa();
        try
        {
            using (var conn = new SqlConnection(vp.conString))
            using (var cmd = new SqlCommand("SELECT COUNT(*) FROM teste cliente WHERE cod_pess = @cod_pess", conn))
            {
                cmd.Parameters.Add("@cod_pess", SqlDbType.Int).Value = codPessNum;
                conn.Open();
                int count = (int)cmd.ExecuteScalar();
                if (count > 0)
                    return "";
                return codPess;
            }
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 2012-11-03
    • 2017-12-26
    • 2016-01-05
    • 2018-02-13
    • 1970-01-01
    • 2014-12-17
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多