使用字段和选项从DataGridView创建MySQL Alter Table语句?

时间:2014-06-08 22:22:03

标签: c# mysql sql regex datagridview

Form http://i61.tinypic.com/2yjv4w9.png 我有一个这样的表格,我可以轻松直观地创建表格。 改变一张桌子要困难得多。 我在表单中做了另一个构造函数,它使用table的语法来改变(来自show create table table_name_to_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), "");
        }
    } 

输入类型值不起作用。 但是这个功能似乎不清楚且太长。 有可能用Regex制作一个算法来压缩table_syntax和alter table吗? 之后我怎么能做alter name ecc这样的陈述...我应该使用Tag看看修改过的项目吗? 我希望有人可以帮助我。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

让我给你一些笔记:

  • 查看CREATE TABLEALTER TABLE上的MySql规范,您似乎只能实现所有选项的子集。没关系,但是你需要定义那个子集,并且一旦你注意到某些表正在使用你遗漏的东西之一,就要考虑它是如何改变的。
  • 如此复杂的任务需要一些长期的功能
  • 据说你应该尝试模块化解析功能:
    • 将列线与其余列解析为parse_COLUMN(..)函数
    • 将其他子句分成自己的命名解析函数,如parse_PF(..)和parse_FK(..)
  • RegEx是一个强大的工具,但我怀疑它会帮助你神奇地消除解析的复杂性。而是通过规范来完成,就像你一样!
  • 我注意到你的" AUTO_INCREMENT"字符串缺少下划线。
  • 另外:您期望PRIMARY KEY子句与列;我已经看到了这一点,但更常见的是在列定义
  • 之后的单独子句中
  • 注意COMMENT条款!
  • 是的,我会使用Tags存储旧值,以便我可以比较并最终构建实际的ALTER命令

你写了输入类型值不起作用。你是什么意思?

一切顺利,听起来很有趣。是为了好玩/学习还是为了工作?