C# 从带有字段和选项的DataGridView创建MySQL Alter Table语句?
我有一个这样的表单,我可以轻松直观地创建表。 改变桌子要困难得多。 我对表单做了另一个构造函数,它采用了table to alter的语法(从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
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语法”。缺少完整语法的哪些部分?