gpt4 book ai didi

.net - 将 SQL 字符串与代码分开

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:59 26 4
gpt4 key购买 nike

我在一个古老的大型 WinForms 项目上工作,其中包含许多 Win 窗体库。

每个表单都在方法中使用硬编码的 sql 命令。有时相同的 SQL 字符串会重复,修改一个我应该研究表单代码中的“相似”字符串。

我知道该架构不是非常漂亮,但目前我们无法对架构进行大型修改。我想做“小步骤”来改善 UI 和 BD 逻辑的分离....

第一步,例如。我认为以某种方式将 sql 字符串与代码“分开”。如何使用 Resources、一个特殊的类、一个 XML 文件来实现这一点?

变体 I - 使用命名资源

' ancient variant '
_SqlPeriod = String.Format("SELECT * FROM DBO.GP_PERIOD WHERE PERIOD = {0} ORDER BY LABEL", Me._Period)

' a better way (?) ... '
_SqlPeriod = String.Format(My.Resources.ResourceManager.GetString("SelectAPeriod"), Me._Period)

最佳答案

通常,您最关心的是使用String.Format 来形成您的SQL 查询,因为这很容易出现Sql Injection Attacks。 ,如果您没有明确验证您的参数。因此,分离这些字符串并不是一种改进(如果在运行时解析它们,将它们移动到 xml 文件中将是一场安全灾难)。

为防止这种情况发生,您需要创建 SqlCommand 实例并以编程方式设置参数(检查 MSDN - How To: Protect From SQL Injection in ASP.NET ),或者使用完全不同的方法并切换到 ORM 框架。

如果您以前没有使用过 ORM,那么迁移到 ORM 可能会花费大量时间,我相信您会选择第一个选项。在这种情况下,只需切换到如上所述的 Sql 参数就会有所改进(即使 sql 字符串是硬编码的)。

为防止重复,您应该考虑将所有数据库访问调用移至单独的项目(数据访问层,DAL)中。如果您想从更小的步骤开始,您可以考虑(开始时)将 SQL 字符串的创建委托(delegate)给不同的层,例如:

_SqlPeriod = QueryStrings.GetPeriodsById(Me._Period) ' <- returns an sql string

这将允许您将参数验证移到一个公共(public)项目中。稍后,您将希望完全避免将 sql 字符串传递到您的 UI 层,而只是获取数据:

_ActualData = Dal.GetPeriodsById(Me._Period) ' <- gets the actual list of periods

关于.net - 将 SQL 字符串与代码分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5753709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com