Как вернуть значение Читателя Данных (ASP. NET MVC) - PullRequest
0 голосов
/ 19 февраля 2020
public ActionResult Index()
{
    string sCurr = "";
    string myConString = "Driver={MySQL ODBC 5.3 Unicode Driver}; SERVER=localhost;Port=0000;DATABASE=ABC;UID=root;PASSWORD=123;OPTION=3;";

    OdbcConnection dbConnection = new OdbcConnection(myConString);
    dbConnection.Open();
    string sql = "SELECT * FROM USER";
    OdbcConnection conn = null;
    OdbcCommand comm = null;
    OdbcDataReader dr = null;
    conn = new OdbcConnection(myConString);
    conn.Open();
    comm = new OdbcCommand(sql, conn);
    dr = comm.ExecuteReader();
    if (dr != null)
    {
        while (dr.Read())
        {
            sCurr = (dr.GetValue(0).ToString());
        }
    }
    return View();
}

Я хочу получить значение [2] и значение [4] для проверки.

Как получить значение?

Пожалуйста, помогите!

Спасибо.

dr = comm.ExecuteReader (); имеют значение как на изображении ниже:

Record In Data Reader

1 Ответ

0 голосов
/ 19 февраля 2020
  • Убедитесь, что ваши IDisposable объекты утилизированы перед возвратом с блоком using(). В противном случае вы можете утечь собственные ресурсы и память (например, вы можете преждевременно исчерпать свой пул DbConnection).
  • Ваш код определяет пустые Odbc... объекты без причины.
  • Используйте async для все операции ввода-вывода, где это возможно - поскольку вы используете ASP. NET, это поддерживается (обратите внимание, что у вас не может быть одновременных async с объектами ADO. NET, тогда как вы можете с файловой системой IO на Windows).
public async Task<ActionResult> Index()
{
    const string connectionString = "Driver={MySQL ODBC 5.3 Unicode Driver}; SERVER=localhost;Port=0000;DATABASE=ABC;UID=root;PASSWORD=123;OPTION=3;";
    //const string sql = "SELECT * FROM USER"; // <-- don't do this. Always name your columns!
    const string sql = "SELECT UserId, Created, UserType, etc FROM `USER`":

    using( OdbcConnection c = new OdbcConnection( connectionString ))
    using( OdbcCommand cmd = c.CreateCommand() )
    {
        await c.OpenAsync();

        cmd.CommandText = sql;

        using( OdbcDataReader rdr = await cmd.ExecuteReaderAsync() )
        {
            while( await rdr.ReadAsync() )
            {
                Int32 userId = rdr.GetInt32( 0 );
                DateTime created = rdr.GetDateTime( 1 );
                String userType = rdr.GetString( 2 );
                // etc...
            }
        }
    }

    // etc...
}

Чтобы вернуть данные, которые будут отображены в виде, передайте их с использованием модели представления:

class UserRow
{
    Int32    UserId  { get; set; }
    DateTime Created { get; set; }
    // etc...
}
public async Task<ActionResult> Index()
{
    const string connectionString = "Driver={MySQL ODBC 5.3 Unicode Driver}; SERVER=localhost;Port=0000;DATABASE=ABC;UID=root;PASSWORD=123;OPTION=3;";
    //const string sql = "SELECT * FROM USER"; // <-- don't do this. Always name your columns!
    const string sql = "SELECT UserId, Created, UserType, etc FROM `USER`":

    using( OdbcConnection c = new OdbcConnection( connectionString ))
    using( OdbcCommand cmd = c.CreateCommand() )
    {
        await c.OpenAsync();

        cmd.CommandText = sql;

        using( OdbcDataReader rdr = await cmd.ExecuteReaderAsync() )
        {
            List<UserRow> list = new List<UserRow>();

            while( await rdr.ReadAsync() )
            {
                list.Add( new UserRow() {
                    UserId = rdr.GetInt32( 0 ),
                    Created = rdr.GetDateTime( 1 ),
                    // etc
                } );
            }

            return this.View( model: list );
        }
    }

    // etc...
}

@model IReadOnlyList<UserRow>

<div>

<table>
    <thead>
        <tr>
            <th>UserID</th>
            <th>Created</th>
            etc
        </tr>
    </thead>
    <tbody>
@foreach( UserRow row in this.Model )
{
        <tr>
            <td>@row.UserId</td>
            <td>@row.Created</td>
            etc
        </tr>
}
    </tbody>
</table>


</div>
...