문제

좋습니다. 현재 내 코드는 다음과 같습니다.

    public MySqlDataReader CreateQuery(string queryString, string connectionString )
    {

        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand(queryString, connection))
            {
                command.Connection.Open();
                command.ExecuteNonQuery();

                MySqlDataReader reader = command.ExecuteReader();
                return reader;
            }
        }
    }

다른 기능에는 다음이 있습니다.

using(MySqlDataReader readers = _connection.CreateQuery(query, connectString))

현재 이 형식에서는 reader를 reader로 반환하면 값이 없습니다.나는 한 단계씩 진행하여 반품 시점에 독자가 올바른 정보를 가지고 있는지 확인했습니다.그러나 독자에게는 가치가 없습니다.아마도 완전히 어리석은 것을 놓치고있을 것입니다.하지만 이에 대한 모든 도움을 주시면 감사하겠습니다.감사해요!

도움이 되었습니까?

해결책

사용 명령을 사용하면 코드가 실제로 제어가 호출자에게 반환되기 전에 연결이 실제로 폐기 될 것입니다.기본적으로 연결 코드에서 생성 된 명령 객체가 호출 코드가 더 이상 사용할 수 없도록 사용할 수 있기 전에 삭제됩니다.

독자 자체가 아닌 쿼리의 결과로 무언가를하고 싶습니다.아마도 테이블에 넣을 수 있습니까?같은 것 :

public DataTable CreateQuery(string queryString, string connectionString )
    {
        DataTable results =  new DataTable("Results");
        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand(queryString, connection))
            {
                command.Connection.Open();
                command.ExecuteNonQuery();

                using (MySqlDataReader reader = command.ExecuteReader())
                    results.Load(reader);
            }
        }
       return results;
    }
.

다른 팁

반환하는 대신 Datareader 또는 모든 기록을 메모리 내로 복사 DataTable 전체적으로 반환하면 IEnumerable<IDataRecord> 이는 기본 인터페이스입니다. DataReader 기록 도구.

그래서 이것은 다음부터 작동해야합니다 yield 원인 Connection 살아남기 위해:

public IEnumerable<IDataRecord> CreateQuery(string queryString, string connectionString)
{
    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        using (MySqlCommand command = new MySqlCommand(queryString, connection))
        {
            command.Connection.Open();
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return (IDataRecord)reader;
                }
            }
         }
    }
}

예를 들어 처음 5개의 레코드만 가져오려면 다음을 수행하십시오.

var records = CreateQuery("SELECT * FROM ais.country;", Properties.Settings.Default.MySQL).Take(5);
foreach (IDataRecord rec in records)
{
    String country = rec.GetString(rec.GetOrdinal("Name"));
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top