如何解决比我目前使用的更好的获取 SQL 数据的方法
我需要从外部 sql Server 数据库中检索数据并在我的 ASP.NET MVC 应用程序中查看它(而不是存储它)。我可以连接到服务器的唯一方法是使用服务器名称、端口号和对服务器所有者提供的 sql Server 存储过程的访问。
目前我知道如何做到这一点的唯一方法是:
a) 编写 .sql
脚本来检索数据。注意我看不到任何 sql Server 表,我只有存储过程的名称和条件。我将结果保存为 .txt
文件
EXEC dbo.listData @Criteria = '<Portal><Data Name="Data" Format="Narrow" Interval="5m">
<Where>
<Column Name="Point" Project="XXX" Value="XXXX" Operator="LIKE" />
<Column Name="Point" Project="YYY" Value="YYYY" Operator="LIKE" />
</Where>
</Data>
</Portal>',@StartDateTime = '12/28/2020',@EndDateTime = '12/29/2020'
b) 创建模型类
public class Alarm_DataModel
{
public string Project { get; set; }
public string Point { get; set; }
}
c) 创建一个控制器,将数据放入模型传递给视图
public ActionResult Index()
{
string[] texts = System.IO.File.ReadAllLines(Server.MapPath("~/App_Data/Test/test.txt"));
texts = texts.Skip(2).ToArray();
List<Alarm_DataModel> Alarm_Data = new List<Alarm_DataModel>();
foreach (string row in texts)
{
if (!string.IsNullOrEmpty(row))
{
int x = row.Length;
Alarm_Data.Add(new Alarm_DataModel
{
Project = row.Substring(0,25),Point = row.Substring(26,60),6
});
}
}
ViewBag.Data = texts;
return View(Alarm_Data);
}
我的问题可能已经被回答过很多次了,但我已经看过了,但找不到任何可以解释的内容。
有没有一种方法可以使用我的控制器获取数据,而不必依赖正在运行的 .sql
脚本并生成 .txt
文件?
由于我对数据库的访问有限,使用提供的存储过程进行查询并填充我的模型以传递给视图的最佳方法是什么?
解决方法
使用 Dapper 时,代码如下所示:
using Dapper;
using System.Data.SqlClient;
using System.Linq;
private IEnumerable<Alarm_DataModel> GetAlarmList()
{
var sql = @"EXEC dbo.listData @Criteria = '<Portal><Data Name=""Data"" Format=""Narrow"" Interval=""5m"">
<Where>
<Column Name=""Point"" Project=""XXX"" Value=""XXXX"" Operator=""LIKE"" />
<Column Name=""Point"" Project=""YYY"" Value=""YYYY"" Operator=""LIKE"" />
</Where>
</Data>
</Portal>'";
using( var connection = new SqlConnection("(connecting string here)") )
{
var values = new { StartDateTime = "2017.1.1",EndDateTime = "2017.12.31" };
return connection.Query<Alarm_DataModel>(sql,values).ToList();
}
}
[HttpGet]
public ActionResult Index()
{
var alarmList = GetAlarmList();
ViewBag.Data = "texts";
return View(alarmList);
}
如果存储过程可以执行并回复一些数据,则一切都在使用您提供的凭据进行。这是正常的生产安全设置。
您还想查看表,这是一个不同的问题,可以使用不同的凭据或访问另一台服务器来解决。
,谢谢 Frank Nielsen,您推荐的代码只对标准值进行了一些小的修改。出于某种原因,我需要将它们包含在查询中才能使其工作。
非常感谢,谢谢
这是最终代码:
public class AlarmDataController : Controller
{
// GET: AlarmData
private IEnumerable<Alarm_DataModel> GetAlarmList()
{
var sql = @"EXEC dbo.listData @Criteria = '<Portal><Data Name=""Data"" Format=""Narrow"" Interval=""5m"">
<Where>
<Column Name=""Point"" Project=""XX"" Value=""XXXX"" Operator=""LIKE"" />
<Column Name=""Point"" Project=""YY"" Value=""YYYY"" Operator=""LIKE"" />
</Where>
</Data>
</Portal>',@StartDateTime = '12/28/2020',@EndDateTime = '12/29/2020'";
string connectionString = "Integrated Security=True;Data Source=XXXX;Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
using (var connection = new SqlConnection(connectionString))
{
return connection.Query<Alarm_DataModel>(sql).ToList();
}
}
[HttpGet]
public ActionResult Index()
{
var alarmList = GetAlarmList();
return View(alarmList);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。