保存绑定到C#中DataGrid的自定义sql查询中的数据
本文关键字:自定义 查询 数据 sql DataGrid 绑定 保存 | 更新日期: 2023-09-27 17:59:01
所以我有这个问题-我想允许我的应用程序的用户对PostgreSql数据库运行选择查询,并且我希望这些查询返回的数据绑定到DataSet
->DataGrid
。问题在于"自定义"部分:)。当然,当我尝试编辑来自带有联接子句的查询的数据时,麻烦就开始了。我收到一个错误,说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
我称之为自定义查询,因为它是由用户编写的,我无法预测用户输入的内容
第一个问题:
正如您所说,正则表达式有点棘手。。。
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:正则表达式语言
- MSDN:Regex类
- MSDN:如何:使用正则表达式搜索字符串
- 堆栈溢出引用
第二个问题:
用户输入自己查询的方式并不好,因为:
对于这类查询,您必须通知用户有关表名和字段名的信息。这意味着你放松了警惕,接受了一些安全风险。
它对用户不友好。对用户来说,用一堆名字和一些硬性规则填充文本框并不简单。请注意,作为一名优秀的开发人员,你必须想象所有用户都是懒惰和白痴。
您不能阻止用户的访问。若用户可以进行自己的查询,那个么他们就可以简单地对所有记录和表进行所有查询。在这种情况下,也许有些信息必须隐藏起来,你无法保证。
您无法说服用户在进行新查询时放弃规则,这将给您和用户带来错误。
您可以简单地制作自己的界面。
- 新的界面对用户来说是一种新的体验,所以他们会喜欢的