从带有字段和选项的 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 语句?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段