这是一个人为的例子,但为了便于解释,我对其进行了简化。
在投入过多的资金之前,请先查看我的更新 时间!
我有一些(很多)代码通常按如下方式查询我的数据库:
SELECT name FROM sites where IsLive=1;
我的挑战是,在某些条件下,返回完整的网站列表,基本上是
SELECT name from sites;
我不希望修改发出SQL的实际C#代码(尽管我必须这样做才能实现我的目标,这纯粹是为了演示目的)。
因此,为了尽可能多地保持不变,我的想法是插入一个名为网站的database-proxy-view
,它返回依赖于control variable
的数据
site
表重命名为site_table
site
的新视图,C#代码现在无意中定位,并根据site_table
从control variable
返回(可能已过滤的)详细信息value(注意视图中变量的限制意味着我必须创建一个函数才能证明这一点 - 请参阅http://dev.mysql.com/doc/refman/5.7/en/create-view.html wrt error 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(例如,当崩溃时 结果设置而不是像我一样扩展结果集 试图在这里做)。 在这方面,我不再在这里寻找答案,而是留给后人作为首选方案,并根据指导方针 - 无论如何,谢谢。
答案 0 :(得分:1)
如果您不想编辑c#代码,那么该变量必须存储在数据库中,尽管我不确定您将如何编辑代码。 如果您愿意编辑代码,则可以访问辅助配置表,该表将具有您希望用户传递给视图的设置。取此并允许用户选择他们想要的内容,然后通过应用程序将其传递给视图。