You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.8 KiB

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.Sqlite;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
namespace WinFormNet5.Controllers
{
public class DataController : Controller
{
private readonly IWebHostEnvironment _env;
private readonly ILogger<DataController> _logger;
public DataController(IWebHostEnvironment env, ILogger<DataController> logger)
{
_env = env;
_logger = logger;
}
[Route("/api/data")]
public IActionResult Data(string query, int pageIndex = 1, int pageSize = 10, bool fetchAll = false)
{
var response = new ResponseMessage
{
PageIndex = pageIndex,
PageSize = pageSize
};
if (!string.IsNullOrWhiteSpace(query))
{
try
{
var baseDir = this._env.WebRootPath;
using var connection = new SqliteConnection($"Data Source={Path.Combine(baseDir, "data.copy.db")}");
connection.Open();
var command = connection.CreateCommand();
command.CommandText = fetchAll ? query : $"{query} limit {pageSize} offset {(pageIndex - 1) * pageSize}";
var results = new List<Dictionary<string, object>>();
var list = new List<object>();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var item = new Dictionary<string, object>();
for (int i = 0; i < reader.FieldCount; i++)
{
item.Add(reader.GetName(i), reader.IsDBNull(i) ? null : reader.GetValue(i));
}
results.Add(item);
}
}
response.Success = true;
response.Total = results.Count;
response.Data = results;
}
catch (Exception ex)
{
this._logger.LogError(ex.ToString());
response.Message = ex.Message;
}
}
return Json(response);
}
private class ResponseMessage
{
public bool Success { get; set; }
public string Message { get; set; }
public int Total { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
public object Data { get; set; }
}
}
}