【问题标题】:A better way to obtain SQL data than I am currently using比我目前使用的更好的获取 SQL 数据的方法
【发布时间】:2021-04-07 07:13:11
【问题描述】:

我需要从外部 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 文件?

由于我对数据库的访问受限,使用提供的存储过程进行查询并填充我的模型以传递给视图的最佳方法是什么?

【问题讨论】:

  • 每个人在访问 sql-server 时都被“限制”为a server name, port number?那么你如何执行 1) - 执行你的 .sql 脚本文件?
  • 看看 Dapper 项目,对你有帮助:learndapper.com/stored-procedures
  • 也许我没有很好地解释自己,当我说受限时,我的意思是当我登录服务器时,我看不到表,甚至看不到我正在提取的数据的架构。我实际上也看不到存储过程,我只是使用它。我不能编辑存储过程或添加另一个,我只是有权使用它。我会看看 Dapper 项目,看看它是否有帮助,谢谢。

标签: sql sql-server asp.net-mvc stored-procedures


【解决方案1】:

使用 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);
        }

如果存储过程可以执行并回复一些数据,那么一切都在使用您提供的凭据。这是一个正常的生产安全设置。

您还想查看表格,这是一个不同的问题,可以通过不同的凭据或访问另一台服务器来解决。

【讨论】:

    【解决方案2】:

    感谢 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多