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

本文关键字:自定义 查询 数据 sql DataGrid 绑定 保存 | 更新日期: 2023-09-27 17:59:01

所以我有这个问题-我想允许我的应用程序的用户对PostgreSql数据库运行选择查询,并且我希望这些查询返回的数据绑定到DataSet->DataGrid。问题在于"自定义"部分:)。当然,当我尝试编辑来自带有联接子句的查询的数据时,麻烦就开始了。我收到一个错误,说UpdateCommand无法自动生成,因为缺少主键列,这是意料之中的事(好吧,至少我预料到了)。。。我提出的解决方案很简单,但对我来说已经足够好了——我有一个表名列表,当在自定义查询中找到其中一个表名称时,我想动态生成自己的UpdateCommand。因此:

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

类似伪代码的东西:

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:如何:使用正则表达式搜索字符串
  • 堆栈溢出引用

第二个问题:

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

    • 对于这类查询,您必须通知用户有关表名和字段名的信息。这意味着你放松了警惕,接受了一些安全风险。

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

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

    • 您无法说服用户在进行新查询时放弃规则,这将给您和用户带来错误。

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

    • 新的界面对用户来说是一种新的体验,所以他们会喜欢的

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