数据读取器,并非所有路径都返回一个值

本文关键字:返回 一个 路径 读取 数据 | 更新日期: 2023-09-27 18:25:33

我想创建一个返回字符串的函数:

public string LienBaseDeConnaissance(string entreprise)
{
    SqlConnection cnx = new SqlConnection("/* connection string */");
    cnx.Open();
    SqlCommand RequeteExiste = new SqlCommand("sp_SEL_LIEN_BASECONNAISSANCE_EXTRANET_CLIENT", cnx);
    RequeteExiste.CommandType = CommandType.StoredProcedure;
    SqlParameter Parameter = RequeteExiste.Parameters.Add("@nom_entreprise", SqlDbType.NVarChar, 15);
    Parameter.Value = entreprise;
    string lienBaseConnaissance;
    SqlDataReader _ReaderLines = RequeteExiste.ExecuteReader();
    while (_ReaderLines.Read())
    {
        if (_ReaderLines["ParStrP1"].ToString() != null)
        {
            lienBaseConnaissance = _ReaderLines["ParStrP1"].ToString();
            return lienBaseConnaissance;
        }
        else
        {
            return null;
        }
    }
    cnx.Close();   
}

由于存储过程,我选择了数据,然后我想将其作为string返回。问题是,如果我不在while ()后面加一个返回,那么所有的代码都不会返回值。然而,我需要包含数据的变量lienBaseConnaissance,在while()之外,有问题的变量不再具有我要查找的值。

数据读取器,并非所有路径都返回一个值

问题在于while循环。它不是if,因此如果没有行,则可能永远不会进入循环。

最简单的解决方案是为返回变量分配一个默认值:

string lienBaseConnaissance = null;
// .... at the end of the method:
return lienBaseConnaissance;

由于(我假设)你正在读取一个值,这也是可能的:

if(_ReaderLines.Read())
{
    if (!_ReaderLines.IsDbNull("ParStrP1"))
    {
        lienBaseConnaissance = _ReaderLines.GetString("ParStrP1");
        return lienBaseConnaissance;
    }
    else
    {
        return null;
    }
}
else
    return null;

请注意您还应该使用using-语句来确保非托管资源得到释放(例如,连接被关闭)。将它用于实现IDisposable的所有内容,例如连接、命令和读取器。

假设_ReaderLines.Read()返回false,则代码执行不会进入while循环,因此不会遵循返回路径。

您需要在cnx.Close();语句之后添加一个return语句。

类似的东西

public string LienBaseDeConnaissance(string entreprise)
{
    SqlConnection cnx = new SqlConnection("Data Source=SR8-ICARE-SQL;Initial Catalog=db_GENAPI_CM;User Id='IcareReader';Password='$Genapi.Reader1$';");
    ...

    SqlDataReader _ReaderLines = RequeteExiste.ExecuteReader();
    while (_ReaderLines.Read())
    {
        if (_ReaderLines["ParStrP1"].ToString() != null)
        {
            lienBaseConnaissance = _ReaderLines["ParStrP1"].ToString();
            return lienBaseConnaissance;
        }
        else
        {
            return null;
        }
    }
    cnx.Close();  
    return null; //this line here
}

我还建议在SqlConnection 中使用Statement

类似的东西

public string LienBaseDeConnaissance(string entreprise)
{
    using(SqlConnection cnx = new SqlConnection("Data Source=SR8-ICARE-SQL;Initial Catalog=db_GENAPI_CM;User Id='IcareReader';Password='$Genapi.Reader1$';"))
    {
        ...     
        SqlDataReader _ReaderLines = RequeteExiste.ExecuteReader();
        ...
    }
    return null; 
}

如果第一行不包含目标变量,函数将返回null。相反,您希望将return null移到while循环之后,这样只有在根本找不到目标变量时才会发生这种情况。

因为如果_ReaderLines.Read()在循环的第一次迭代时返回false,那么您就不会进入while循环,但您会退出并到达方法的出口,而没有任何返回值。

但是您的代码实际上根本不需要循环,因为您的意图是只读取第一条记录并立即退出,所以我可以建议更改您的代码,为变量lientBaseConnaisance分配默认值,在_ReaderLines.read()上使用if,然后下降到方法末尾的返回点-

    string lienBaseConnaissance = null;
    SqlDataReader _ReaderLines = RequeteExiste.ExecuteReader();
    if(_ReaderLines.Read())
    {
         if (_ReaderLines["ParStrP1"].ToString() != null)
             lienBaseConnaissance = _ReaderLines["ParStrP1"].ToString();
    }
    cnx.Close();   
    return lienBaseConnaissance;
相关文章: