【发布时间】:2017-02-14 12:50:40
【问题描述】:
我还是个新手,我被分配了维护以前完成的代码的任务。 我有一个模拟 SQL Management Studio 的网络,例如限制删除选项,因此基本用户不会搞砸我们的服务器。 好吧,我们有一个需要一个或多个查询的函数,它工作正常,但是我们的服务器 RAM 被复杂的查询炸毁了,也许它没有那么多数据,但是它的转换 xml 和所有我仍然没有的东西了解 SQL。
这是实际功能:
public DataSet ExecuteMultipleQueries(string queries)
{
var results = new DataSet();
using (var myConnection = new SqlConnection(_connectionString))
{
myConnection.Open();
var sqlCommand = myConnection.CreateCommand();
sqlCommand.Transaction = myConnection.BeginTransaction(IsolationLevel.ReadUncommitted);
sqlCommand.CommandTimeout = AppSettings.SqlTimeout;
sqlCommand.CommandText = queries.Trim();
var dataAdapter = new SqlDataAdapter { SelectCommand = sqlCommand };
dataAdapter.Fill(results);
return results;
}
}
我有点迷茫,我已经阅读了许多不同的答案,但要么我没有正确理解它们,要么它们无法以任何方式解决我的问题。
我知道我可以使用 Linq-toSql- 或 Entity,我试过了,但我真的不知道如何将它们与“未知”查询一起使用,无论如何我都可以尝试进行更多研究,所以如果你认为它们会有所帮助我正在接近解决方案,无论如何,我会努力学习它。
言归正传:
调试时该函数似乎停止在dataAdapter.Fill(results),此时服务器尝试回答查询并消耗其所有RAM并自行阻塞。我该如何解决这个问题?我想可能是通过让SQL返回一定数量的数据,将其存储在某个集合中,然后继续返回数据,一直继续直到没有更多数据可以从SQL返回,但我真的不知道如何检测是否有任何数据要从 SQL 返回。
我也想过在两个不同的线程中读取和存储,但我不知道如何将一个线程中的数据存储在另一个线程异步中(如果解决了问题就更少了)。
所以,是的,我没有任何明确的东西,所以任何指导或提示将不胜感激。
提前致谢,很抱歉发了这么长的帖子。
【问题讨论】:
-
更重要的是,你为什么要执行来自用户的任意 SQL 语句?这是非常危险的,将导致“用户”搞砸您的数据库。请参阅OWASP - SQL Injection 页面。
-
我同意 BanksySan。这是一个可怕的想法。如果您想阻止用户执行某些操作,请为此使用权限。如果有不应该编写查询的用户,您可以为他们创建报告。
-
...另外,包装你没有处理你的
Transaction对象。您需要将其包装在using中,但完全不使用它可能会更好。 -
API 有限,因此用户无法执行 DELETE 或 DROP,它是 QA 团队的内部网站。 QA 团队只能执行来自不同环境的查询,因此他们无法删除任何内容
-
另外,为什么这个问题被否决了?我不介意投反对票,但我想要一些反馈,这样我就可以改进 SO,谢谢
标签: c# sql sql-server entity-framework linq