将数据库自动中的所有列添加到INSERT INTO查询中

时间:2017-02-27 13:44:47

标签: c# mysql wpf

我有一个WPF窗口,我可以在其中添加一个Customer到数据库。标签和文本框是按照数据库表中的列数量添加的程序。

现在,如果我在文本框中放入一些文本,我想将所有这些文本保存在数据库中。

我的代码到现在为止:

try {
    for (int i = 0; i < textboxes.Count; i++)
    {
        var value = textboxes[i];
        var column = labels[i];
        MySqlCommand cmd = connection.CreateCommand();
        cmd.CommandText = "INSERT INTO firmenkunden ("+column.Name+") VALUES ('"+value.Text+"')";
        cmd.ExecuteNonQuery();
    }
    MessageBox.Show("Der Firmenkunde wurde erfolgreich erstellt.");
    this.Close();
}
catch (MySqlException ex) {
    MessageBox.Show(ex.Message);
}

但这不起作用。它现在看起来像这样: enter image description here

有人知道我该怎么做吗?

3 个答案:

答案 0 :(得分:3)

问题是如何创建查询以在数据库上执行。 请参阅,对于您正在执行Insert的每个列,但是您需要将所有列发送到命令,因此请尝试执行此操作:

   var columns = new System.Text.StringBuilder();
   var values = new System.Text.StringBuilder();
   MySqlCommand cmd = connection.CreateCommand();
   for (int i = 0; i < textboxes.Count; i++)
   {
       var value = textboxes[i];
       var column = labels[i];
       cmd.Parameters.AddWithValue("@" + column.Name, value.Text);
       string complement = (i == 0 ? string.Empty : ",");
       columns.Append(complement + column.Name);
       values.Append(complement + "@" + column.Name);
   }
   cmd.CommandText = "INSERT INTO firmenkunden (" + columns.ToString() + ") VALUES (" + values.ToString() + ")";

您需要做的另一件事是使用MySqlParameters而不是查询的concat值。 Here有一个解释原因,here如何使用它。

我希望它可以帮到你。

答案 1 :(得分:0)

您每个文本框生成一个查询。您需要将所有列和值添加到一个查询。

这样的东西应该可以工作(未经测试),但根据数据类型,某些字段可能需要转义和/或不同的引号处理。

 List<String> columns = new List<String>();
 List<String> values = new List<String>();

 for (int i = 0; i < textboxes.Count; i++)
 {
    var value = textboxes[i];
    var column = labels[i];

    columns.add(column);
    values.add(value);
 }

 MySqlCommand cmd = connection.CreateCommand();
 cmd.CommandText = "INSERT INTO firmenkunden (`"+String.Join("`,`", columns)+"`) VALUES ('"+String.Join("'", values)+"')";
 cmd.ExecuteNonQuery();

答案 2 :(得分:0)

您遇到的主要问题是您正在执行多个插入,您可以通过使用循环来构建单个INSERT命令来解决此问题。

string queryText = "INSERT INTO firmenkunden (";

for (int i = 0; i < textboxes.Count; i++)
{
    var column = labels[i];
    if (i < textboxes.Count - 1)
        queryText += column.Name + ",";
    else
        queryText += column.Name;
}

queryText += ") VALUES (";

for (int i = 0; i < textboxes.Count; i++)
{
    var value = textboxes[i];
    if (i < textboxes.Count - 1)
        queryText += "'" + value.Text + "',";
    else
        queryText += "'" + value.Text + "')";
}

MySqlCommand cmd = connection.CreateCommand();
cmd.CommandText = queryText;
cmd.ExecuteNonQuery();

还有许多其他方法可以构建字符串。我建议花一些时间阅读字符串连接,我会使用StringBuilder而不是我提供的内容。 String还提供了许多可能有用的静态方法。

所有这些都说有更好的方法可以做到这一点,你的实现和上面的实现不是最佳实践。您可能希望调查Linq to SQL,甚至更好的实体框架。还有其他选择,但它们不是可访问的。如果您希望继续构建命令,您至少需要查看参数化的SQL。