Datareader,并非所有路径都返回一个值

时间:2013-07-31 09:16:03

标签: c# string function datareader

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

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()之外,所讨论的变量不再具有我正在寻找的值。

4 个答案:

答案 0 :(得分:3)

问题是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的所有内容,以及连接,命令和阅读器。

答案 1 :(得分:1)

假设_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
}

我还建议查看using Statement以获取SqlConnection

这样的东西
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; 
}

答案 2 :(得分:0)

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

但是你的代码根本不需要循环,因为你的意图是只读取第一条记录并立即退出,所以我建议改变你的代码,为变量 lienBaseConnaisance 分配一个默认值strong>,在 _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;

答案 3 :(得分:0)

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