在 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的不同列表