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-ステートメントを使用して、管理されていないリソースが確実に破棄されるようにする必要があることに注意してください (たとえば、接続が閉じられます)。を実装するすべてのもの、つまりIDisposable接続、コマンド、リーダーに使用します。

于 2013-07-31T09:17:41.053 に答える
0

最初の行にターゲット変数が含まれていない場合、関数は null を返します。代わりに、return null を while ループの後に移動する必要があるため、ターゲット変数がまったく見つからない場合にのみ発生します。

于 2013-07-31T09:20:33.077 に答える
0

ループの最初の繰り返しで false が返された場合、_ReaderLines.Read()while ループには入らず、戻り値なしでメソッドの終了に到達するためです。

ただし、最初のレコードだけを読み取ってすぐに終了することが意図されているため、コードにループはまったく必要ありません。そのため、コードを変更して変数にデフォルト値を割り当て、_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 に答える