数据读取器,并非所有路径都返回一个值
本文关键字:返回 一个 路径 读取 数据 | 更新日期: 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;