gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:10:29 25 4
gpt4 key购买 nike

Form我有一个这样的表格,我可以轻松直观地创建表格。更改表要困难得多。我已经为表单做了另一个构造函数,它采用表的语法来更改(来自 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之类的语句...我应该使用标签来查看修改的项目吗?我希望有人能帮助我。提前致谢。

最佳答案

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

让我向您提供一些注意事项:

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

您写道输入类型值不起作用。您这是什么意思?

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

关于c# - 从带有字段和选项的 DataGridView 创建 MySQL Alter Table 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24111487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com