我有一个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);
}
有人知道我该怎么做吗?
答案 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。