0

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

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. 问题是,如果我不在 后面加上 return while (),所有代码都不会返回值。但是我需要lienBaseConnaissance包含数据的变量,并且在 中while(),有问题的变量不再具有我正在寻找的值。

4

4 回答 4

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-statement 来确保释放非托管资源(例如,连接被关闭)。将它用于实现的所有内容,IDisposable例如连接、命令和阅读器。

于 2013-07-31T09:17:41.053 回答
1

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

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

就像是

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 的语句

就像是

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; 
}
于 2013-07-31T09:18:54.143 回答
0

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

但是您的代码根本不需要循环,因为您的意图是仅读取第一条记录并立即退出,因此我建议您更改代码,将默认值分配给变量lienBaseConnaisance,在_ReaderLines 上使用if。 Read() 并在方法结束时落到返回点——

    string lienBaseConnaissance = null;
    SqlDataReader _ReaderLines = RequeteExiste.ExecuteReader();

    if(_ReaderLines.Read())
    {
         if (_ReaderLines["ParStrP1"].ToString() != null)
             lienBaseConnaissance = _ReaderLines["ParStrP1"].ToString();
    }
    cnx.Close();   
    return lienBaseConnaissance;
于 2013-07-31T09:18:21.293 回答
0

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

于 2013-07-31T09:20:33.077 回答