我想创建一个返回字符串的函数:
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()
之外,所讨论的变量不再具有我正在寻找的值。
答案 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循环之后,这样只有在根本找不到目标变量时才会发生。