C# 从带有字段和选项的DataGridView创建MySQL Alter Table语句?

C# 从带有字段和选项的DataGridView创建MySQL Alter Table语句?,c#,mysql,sql,regex,datagridview,C#,Mysql,Sql,Regex,Datagridview,我有一个这样的表单,我可以轻松直观地创建表。 改变桌子要困难得多。 我对表单做了另一个构造函数,它采用了table to alter的语法(从show create table\u name\u到\u alter) 我从构造函数调用一个函数,该函数应填充所有datagrid字段: private void load_table_fields_into_datagrid(string table_syntax) { /* CREATE TABLE

我有一个这样的表单,我可以轻松直观地创建表。 改变桌子要困难得多。 我对表单做了另一个构造函数,它采用了table to alter的语法(从
show create table\u name\u到\u alter
) 我从构造函数调用一个函数,该函数应填充所有datagrid字段:

    private void load_table_fields_into_datagrid(string table_syntax)
    {
        /*
         CREATE TABLE `città` (
        `ID_CITTA` int(11) NOT NULL,
        `Città` varchar(45) DEFAULT NULL,
         PRIMARY KEY (`ID_CITTA`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8
        I have to decompress that syntax and insert into data grid view
         */
        string[] app = table_syntax.Split('\n');
        table_name_textbox.Text = app[0].Split(new char[] { '`', '`' })[1];
        for (int i = 1; app[i][2]=='`' ; i++)
        {
            if (app[i].Contains("NOT NULL"))
            {
                dataGridView1.Rows[i - 1].Cells[4].Value = true;
                app[i] = app[i].Replace("NOT NULL", "");
            }
            if (app[i].Contains("PRIMARY KEY"))
            {
                dataGridView1.Rows[i - 1].Cells[2].Value = true;
                app[i] = app[i].Replace("PRIMARY KEY", "");
            }
            if (app[i].Contains("UNIQUE"))
            {
                dataGridView1.Rows[i - 1].Cells[3].Value = true;
                app[i] = app[i].Replace("UNIQUE", "");
            }
            if (app[i].Contains("BINARY COLUMN"))
            {
                dataGridView1.Rows[i - 1].Cells[5].Value = true;
                app[i] = app[i].Replace("BNARY COLUMN", "");
            }
            if (app[i].Contains("UNSIGNED DATA"))
            {
                dataGridView1.Rows[i - 1].Cells[6].Value = true;
                app[i] = app[i].Replace("UNSIGNED DATA", "");
            }
            if (app[i].Contains("AUTO INCREMENT"))
            {
                dataGridView1.Rows[i - 1].Cells[7].Value = true;
                app[i] = app[i].Replace("AUTO INCREMENT", "");
            }
            if (app[i].Contains("ZERO FILL"))
            {
                dataGridView1.Rows[i - 1].Cells[8].Value = true;
                app[i] = app[i].Replace("ZERO FILL", "");
            }
            if (app[i].Contains("DEFAULT"))
            {
                System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(app[i], @"DEFAULT\s+\S+");
                if (m.Success)
                {
                    dataGridView1.Rows[i - 1].Cells[9].Value = m.Value.TrimEnd(',').Split(' ')[1];
                    app[i].Replace(dataGridView1.Rows[i - 1].Cells[9].Value.ToString(), "");
                }
            }
            /* NOW I ONLY HAVE NAME + TYPE*/
            dataGridView1.Rows.Add();
            dataGridView1.Rows[i - 1].Cells[0].Value = app[i].Split(new char[] { '`', '`' })[1];
            app[i]= app[i].Replace(app[i].Split(new char[] { '`', '`' })[1], "");
            app[i] = app[i].Replace("``", "");
            //type
            (dataGridView1.Rows[i].Cells[1] as DataGridViewComboBoxCell).Items.Add(app[i].Substring(0, app[i].IndexOf(')') + 1));
            app[i] = app[i].Replace(app[i].Substring(0, app[i].IndexOf(')') + 1), "");
        }
    } 
输入类型值无效。 但这个功能似乎不清楚,而且太长。 是否可以使用正则表达式生成一个算法来压缩表_语法并更改表? 在那之后,我如何做诸如ALTERNAME ecc。。。我是否应该使用标签查看修改的项目? 我希望有人能帮助我。
提前感谢。

这是一个非常雄心勃勃的项目,我祝贺你迄今为止的成功

让我给你一些提示:

  • 查看上的MySql规范,很明显,您只能实现全部选项的子集。这没关系,但您需要定义该子集,并考虑一旦注意到某些表使用的是您遗漏的内容之一,该子集可能会发生什么变化
  • 在这样一项复杂的任务中,需要几个漫长而复杂的功能
  • 也就是说,您应该尝试将解析功能模块化:
    • 将列行与其余列行分离分析为parse_column(..)函数
    • 将其他子句分离为它们自己的命名解析函数,如parse_PF(..)和parse_FK(..)
  • 正则表达式是一个强大的工具,但我怀疑它能否帮助您神奇地消除解析的复杂性。相反,通过规范工作,就像你做的一样
  • 我注意到您的“自动增量”字符串缺少下划线
  • 另外:您希望主键子句与列一起使用;我已经看到了这一点,但更多的情况是在列定义之后的单独子句中出现
  • 注意评论条款
  • 是的,我会使用
    标记
    来存储旧值,以便比较并最终构造实际的ALTER命令
您编写的输入类型值无效。你这是什么意思


尽管如此,这听起来很有趣。它是为了娱乐/学习还是为了工作?

定义子集是什么意思?然而,这是一个考试项目。我所说的“实现子集”是指“不完全实现MySql语法”。缺少完整语法的哪些部分?