【发布时间】:2016-09-26 00:39:27
【问题描述】:
这是一个人为的例子,但为了便于解释,我对其进行了简化。
在您投入过多资金之前,请在底部查看我的更新 时间!
背景
我有一些(很多)代码通常如下查询我的数据库:
SELECT name FROM sites where IsLive=1;
我的挑战是,在某些条件下,返回完整网站列表,基本上
SELECT name from sites;
我不希望修改发出 SQL 的实际 C# 代码(尽管我可以这样做,以实现纯粹用于演示目的的目标)。
因此,为了尽可能保持原样,我的想法是插入一个名为 site 的 database-proxy-view,它返回依赖于 control variable
方法
- 将现有的
site表重命名为site_table - 创建一个名为
site的新视图,C# 代码现在会在不知不觉中将其作为目标,并根据control variable值从site_table返回(可能已过滤的)详细信息(请注意视图中的变量意味着我必须创建一个函数来证明这一点 - 请参阅 http://dev.mysql.com/doc/refman/5.7/en/create-view.html wrt 错误 1351)
所做的更改
ALTER TABLE site RENAME TO site_table;CREATE FUNCTION controlVariableFn() RETURNS VARCHAR(16) RETURN @controlVariable;CREATE OR REPLACE VIEW site AS SELECT * from site_table WHERE (IsLive = 1 OR controlVariableFn() = 'SHOWALL');
上面的语句丑但是达到了我想要的结果,但是我的问题是动态地通过controlVariable而不改变我发送的主要SQL查询。
我的问题
有没有办法(理想情况下,当我创建连接对象时)在要执行的实际 SQL 之外定义 controlVariable,但 View 仍然可以像上面一样访问它它已作为常规用户变量参数提供给查询?
所以代码看起来像
var connectionString = "Server=localhost;User ID=un;Password=pw;Database=dbname;....";
DbConnection db = new MySql.Data.MySqlClient.MySqlConnection
(connectionString, "controlVariable=SHOWALL");
var results = db.Query<Site>("SELECT * FROM site;");
(我知道这不是一个明智的永久解决方案)
更新 如上所述,我的首选解决方案对我不起作用,因为一旦我进入我的数据访问层,因为结果集将 基本上被再次过滤回原始集合。在某些情况下,它 可以工作;这将取决于发出的 SQL(例如,当折叠一个 结果集下来,而不是像我一样尝试扩展结果集 试图在这里做)。 在这方面,我不再在这里寻找答案,而是将其作为首选选项和指南留给后代 - 无论如何,谢谢。
【问题讨论】:
标签: c# mysql view parameters connection-string