通过连接字符串或连接对象设置 MySQL 变量?

Posted

技术标签:

【中文标题】通过连接字符串或连接对象设置 MySQL 变量?【英文标题】:MySQL variable setting through connection string or connection object? 【发布时间】:2016-09-26 00:39:27 【问题描述】:

这是一个人为的例子,但为了便于解释,我对其进行了简化。

在您投入过多资金之前,请在底部查看我的更新 时间!

背景

我有一些(很多)代码通常如下查询我的数据库:

SELECT name FROM sites where IsLive=1;

我的挑战是,在某些条件下,返回完整网站列表,基本上

SELECT name from sites;

我不希望修改发出 SQL 的实际 C# 代码(尽管我可以这样做,以实现纯粹用于演示目的的目标)。 因此,为了尽可能保持原样,我的想法是插入一个名为 sitedatabase-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(例如,当折叠一个 结果集下来,而不是像我一样尝试扩展结果集 试图在这里做)。 在这方面,我不再在这里寻找答案,而是将其作为首选选项和指南留给后代 - 无论如何,谢谢。

【问题讨论】:

【参考方案1】:

如果您不想编辑 c# 代码,则必须将变量存储在数据库中,尽管我不确定您将如何不编辑代码。 如果您愿意编辑代码,则可以访问辅助配置表,该表将包含您希望用户传递给视图的设置。接受这个并允许用户选择他们想要的,然后通过应用程序将其传递给视图。

【讨论】:

谢谢@Shon - 这是一个有用的建议,我没有想到,虽然我需要将后续查询与存储的变量相关联,但我不确定我会如何做到这一点。我能够编辑代码,我只是想避免编辑 existing 查询。所以你的想法符合我的标准。我也想知道不同类别的用户是否可以有不同的连接字符串来访问自定义 site 视图。如果可行,我将对此进行更多考虑并回帖。

以上是关于通过连接字符串或连接对象设置 MySQL 变量?的主要内容,如果未能解决你的问题,请参考以下文章

在设置odbc的mysql数据源时出现了如下问题 求助~~!!

Javascript - 使用字符串连接设置变量[重复]

用localhost不能连上mysql,但用127.0.0.1却可以,是啥原因

mysql 状态变量(部分)

警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)

Hive JDBC 连接设置或与 MySQL 的映射