- Убедитесь, что ваши
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>