在 C# 中保存绑定到 DataGrid 的自定义 sql 查询中的数据

Posted

技术标签:

【中文标题】在 C# 中保存绑定到 DataGrid 的自定义 sql 查询中的数据【英文标题】:Save data from custom sql query bound to a DataGrid in C# 【发布时间】:2014-06-03 07:25:06 【问题描述】:

所以我有这个问题 - 我想允许我的应用程序的用户对 PostgreSql 数据库运行选择查询,并且我希望这些查询返回的数据绑定到 DataSet -> DataGrid。问题是“自定义”部分:)。当然,当我尝试使用 join 子句编辑来自查询的数据时,麻烦就开始了。我收到一条错误消息,指出由于缺少主键列而无法自动生成 UpdateCommand,这是预期的(嗯,至少我期待它)......我想出的解决方案是原始的,但很好对我来说足够了 - 我有一个表名列表,当在自定义查询中找到其中一个表名时,我想即时生成我自己的 UpdateCommand。所以:

    我在编写从查询中获取表名的正则表达式时遇到问题,因此非常感谢您提供任何帮助:)。事情很棘手 - 您必须记住,表名也可能作为列名找到,因此正则表达式应该能够过滤掉这种情况。 在我的场景中通常是个好主意吗?也许有更简单和/或更优雅的解决方案来解决我的问题?

类似伪代码的东西:

string[] names = new string[]  "table1", "table2" ;
string customQuery = GetWhateverUserWroteInATextBox();

//what I want to do is to find name coming from names array in the customQuery

我将其称为自定义查询,因为用户编写它,我无法预测用户输入会是什么。

【问题讨论】:

其实我看不懂。你能解释一下when one of those table names is found in custom query, then I want to generate my own UpdateCommand on the fly吗?什么是自定义查询?一些代码可以使它更有说服力。 @HaMeD 我更新了我的问题。 【参考方案1】:

第一个问题:

正如你所说,正则表达式有点棘手......

        string[] tableNames = new string[]  "table1", "table2" ;
        List<string> fields = new List<string>();
        Regex rgx = new Regex(@"\w+(?=\s?,?)");
        MatchCollection matches = rgx.Matches(textBox1.Text);
        foreach (Match m in matches)
        
            if (!tableNames.Contains(m.Value))
            
                fields.Add(m.Value);
            
        

如果你可以说服你的用户使用 , 分隔字段,这很好;)

如果我的模式与您的名称样式不匹配,您可以制作自己的模式,这里有一些说明:

MSDN: Regular Expression Language MSDN: Regex Class MSDN: How to: Search Strings Using Regular Expressions *** Reference

第二个问题:

    用户输入自己查询的方式不好,因为:

    对于此类查询,您必须告知用户表和字段名称。这意味着您可以放松警惕并接受一些安全风险。

    它对用户不友好。用一堆名字和一些硬性规则填充一个文本框对用户来说并不简单。请注意,要成为一名优秀的开发人员,您必须想象所有用户都是懒惰和白痴。

    您不能阻止用户的访问。如果用户可以进行自己的查询,那么他们可以简单地对您的所有记录和表进行所有查询。在这种情况下,可能有些信息必须隐藏起来,您无法保证。

    您无法说服用户在进行新查询时不遵守规则,这会给您和用户带来错误。

    您可以简单地制作自己的界面。

    新界面为用户带来了全新体验,因此他们会喜欢上它。

【讨论】:

至于您对第二个问题的回答——我不担心安全风险,因为我正在编写一个像 PgAdmin 这样的应用程序——用于浏览各种 postgres 数据库的工具。简而言之 - 它是程序员的工具,程序员有时只需要运行一些复杂的查询,这就是我问这个的原因。想象一下,您想从带有多个连接子句的选择查询中获取数据 - 有时您只想浏览返回的数据,但如果您可以编辑它不是很好吗? 至于你对第一个问题的回答,我明天试试,如果可行,我会接受这个答案。 @SzwornyDziąch 我不确定您要实现什么,但您可以用图形对象替换任何查询。如果不是您的答案,请忽略它:)。关于第一个,正如我所说,查询必须在规则中,如果这对你不起作用,就试着让你自己的模式。

以上是关于在 C# 中保存绑定到 DataGrid 的自定义 sql 查询中的数据的主要内容,如果未能解决你的问题,请参考以下文章

DataGridComboBoxColumn绑定到DataGrid ItemsSource的不同列表

WPF C# DataGrid 绑定到存储过程

在 MVVM 中的 Datagrid 中绑定 WPF 组合框不保存更改

WPF Datagrid闪烁问题

C#,WPF怎么把txt里的内容导到DataGrid里

c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?