12

私はこのコードを持っています:

public static SqlDataReader GetGeneralInformation ( int RecID )
{
    using ( var conn = new SqlConnection( GetConnectionString() ) )
    using ( var cmd = conn.CreateCommand() )
    {
        conn.Open();
        cmd.CommandText =
        @"SELECT cs.Status, cs.Completed
          FROM NC_Steps s
          INNER JOIN NC_ClientSteps cs
              ON cs.RecID = s.RecID
          WHERE cs.ClientID = 162
          AND s.RecID = @value";
        cmd.Parameters.AddWithValue( "@value", RecID );
        using ( var reader = cmd.ExecuteReader() )
        {
            if ( reader.Read() )
            {
                return reader;
            }
            return null;
        }
    }
}

これを参照するにはどうすればよいですか?

これを試しましたが、うまくいきません。

SqlDataReader reader = GeneralFunctions.GetGeneralInformation();

また、読者からどのように読み取れますか?

Reader.GetString( reader.GetOrdinal( "Status" ) )

編集

次のエラーが表示されます。

例外の詳細: System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

更新されたコードは次のとおりです。

public static IEnumerable<IDataRecord> GetGeneralInformation ( int ClientID )
{
    using ( var conn = new SqlConnection( GetConnectionString() ) )
    using ( var cmd = conn.CreateCommand() )
    {
        conn.Open();
        cmd.CommandText =
        @"SELECT i.GoLiveDate, i.FirstBonusRun, i.TechFName, i.TechLName, i.TechEmail, i.TechPhone, i.WebISPFName, i.WebISPLName, 
          i.WebISPEmail, i.WebISPPhone, i.FullFillFName, i.FullFillLName, i.FullFillEmail, i.FullFillPhone, d.FName,
          d.LName, d.HomePhone, d.Email
          FROM NC_Information i
          INNER JOIN Distributor d
            ON d.DistID = i.ClientID
          WHERE clientID = @value";
        cmd.Parameters.AddWithValue( "@value", ClientID );
        using ( var reader = cmd.ExecuteReader() )
        {
            while ( reader.Read() )
            {
                yield return reader;
            }
            yield return null;
        }
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    IEnumerable<IDataRecord> reader = GeneralFunctions.GetGeneralInformation( (int)Session[ "DistID" ] );

    //string result = GeneralFunctions.GetGeneralInformation( Globals.GeneralInformation ).First()[ "Status" ].ToString();
}
4

5 に答える 5

21

問題は、(returnステートメントを介して)関数を終了するとusingブロックから追い出されるため、使用しているSqlDataReaderSqlConnectionsが破棄されることです。この問題を回避するには、次のように関数のシグネチャを変更してみてください。

public static IEnumerable<IDataRecord> GetGeneralInformation ( int RecID )

次に、次のように関数の中央を更新します。

using ( var reader = cmd.ExecuteReader() )
{
    while ( reader.Read() )
    {
        yield return reader;
    }
}

最後の「どうやって読むの?」一部、次のようになります。

int RecID = 12345;
string result = GetGeneralInformation(RecID).First()["Status"].ToString();
于 2012-04-20T19:45:54.093 に答える
6

app.config または web.config の AppSettings セクションに接続文字列を追加します。

   public string GetSqlConnection()
    {
        return  System.Configuration.ConfigurationManager.AppSettings["SqlConnectionString"];
    }

//SqlDataReader の結果を返す関数

    public SqlDataReader executeReader(string sql, SqlParameter[] parameters=null)
    {
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = GetSqlConnection();
        conn.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = sql;
        if (parameters != null)
        {
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter p in parameters)
            {
                cmd.Parameters.Add(p);
            }
        }
        else
        {
            cmd.CommandType = CommandType.Text;
        }
        SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        return reader;
    }

この機能を使用するには:

        string query = @"SELECT cs.Status, cs.Completed
      FROM NC_Steps s
      INNER JOIN NC_ClientSteps cs
          ON cs.RecID = s.RecID
      WHERE cs.ClientID = 162
      AND s.RecID = @value";
       //you can add more parameters by adding commas
       var parameters = new SqlParameter[] {
            new SqlParameter("@value", RecID )
           };

        SqlDataReader dr = executeReader(query, parameters);
        while (dr.Read())
        {
            //fill your controls with data 
        }
        dr.Close();
于 2014-02-22T00:19:18.830 に答える
0

問題は、メソッド内でデータベース接続を作成していることです。

多くのメソッド間でデータベース リソースを共有する場合は、SqlConnectionこの範囲外に移動してください。

このようにして、この関数から Reader を返すことができ、永続化されます。

.Read()また、この関数内ではなく、オブジェクトを返すだけです。

于 2013-05-11T19:16:32.050 に答える
-1

定義により、usingステートメントは、呼び出された後にオブジェクトを破棄することになっています。

したがって、データ リーダーを返却すると、データ リーダーは廃棄されます。

于 2012-04-20T19:47:58.537 に答える