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

Posted

技术标签:

【中文标题】从带有字段和选项的 DataGridView 创建 MySQL Alter Table 语句?【英文标题】:Create an MySQL Alter Table statement from a DataGridView with fields and options? 【发布时间】:2014-06-08 22:22:02 【问题描述】:

我有一个这样的表格,我可以轻松直观地创建表格。 改变一张桌子要困难得多。 我对表格的语法做了另一个构造函数来改变(来自show create table table_name_to_alter) 从构造函数中,我调用了一个应该填充所有数据网格字段的函数:

    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), "");
        
     

输入类型值不起作用。 但是这个函数好像不太清楚,太长了。 是否可以使用正则表达式来压缩 table_syntax 和更改表? 在那之后我怎么能做诸如alter name ecc之类的语句......我应该使用Tag来查看修改的项目吗? 我希望有人能帮助我。 提前致谢。

【问题讨论】:

【参考方案1】:

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

让我给你一些注意事项:

查看CREATE TABLE 和ALTER TABLE 上的mysql 规范,很明显您只能实现全部选项的子集。没关系,但是您需要定义该子集,并考虑一旦您注意到某些表正在使用您遗漏的东西之一,它可能会如何改变.. 对于如此复杂的任务,预计会有一些冗长而复杂的功能 话虽如此,您应该尝试模块化解析函数: 将列行与其余行分开解析到 parse_COLUMN(..) 函数中 将其他子句分离成它们自己的命名解析函数,如 parse_PF(..) 和 parse_FK(..) RegEx 是一个强大的工具,但我怀疑它能否帮助您神奇地消除解析的复杂性。而是像您一样按照规范进行操作! 我注意到您的“AUTO_INCREMENT”字符串缺少下划线。 另外:您希望 PRIMARY KEY 子句带有列;我见过这种情况,但更常见的是在列定义之后的单独子句中 注意 COMMENT 子句! 是的,我会使用Tags 来存储旧值,以便进行比较并最终构建实际的 ALTER 命令

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

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

【讨论】:

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

以上是关于从带有字段和选项的 DataGridView 创建 MySQL Alter Table 语句?的主要内容,如果未能解决你的问题,请参考以下文章

将值从一个 DataGridView 复制到另一个

Javascript

DataGridView ComboBox 列动态项

如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段

带有中继器的嵌套选项卡 - 高级自定义字段 Wordpress

Symfony2 生成带有选项的实体字段