我一直在为按钮创建一个类,您可以从表的数据库中添加和删除行,但是这是我第一次串联一个字符串,我怀疑它是不起作用的到命令文本。
public static void deleteButton(string databaseName, string IDname, DataGridView dgv)
{
Helper.openConnection();
SqlCommand cmd = new SqlCommand();
cmd.Connection = Helper.cn;
string IDLocation = dgv.SelectedRows[0].Cells[0].Value.ToString();
cmd.CommandText = "delete from " + databaseName + " where " + IDname + " = " + IDLocation;
Helper.cn.Close();
MessageBox.Show("Successfully Deleted!");
}
public static void addButton(string databaseName, List<string> values, DataGridView dgv, bool isAdd)
{
Helper.openConnection();
SqlCommand cmd = new SqlCommand();
cmd.Connection = Helper.cn;
string message = isAdd == true? "Sucessfully Added" : "Sucessfully Edited";
string command = "insert into " + databaseName + " values(";
for (int i = 0; i < values.Count; i++)
{
command += values[i];
if(i != values.Count - 1) command += ", ";
}
command += ")";
cmd.CommandText = command;
MessageBox.Show(message);
Helper.cn.Close();
}
谢谢您的时间帮助我。
两个问题:
- 您正在使用
INSERT INTO [databaseName]
。那应该是INSERT INTO [tableName]
。这就是为什么它不起作用。 - 不要将值连接到
SQL text
中。它为SQL注入打开了大门,也使SQL Server更难重复使用查询计划。而是使用查询参数。文档中有一个示例。
我会把设计留给您,然后尝试回答问题。您实际上是否看过命令文字?您是否尝试将命令文本粘贴到查询中并手动运行?您需要引用字符串值。您的功能和查询使用" databasename"。这应该是表名而不是数据库名称。
这里的评论全都在目标上,但是代码的关键问题是您什么都没做。您已经打开了连接,声明为sql命令,但是您不执行它。
是的,是的,使用参数,但是如果您希望您的SQL工作,则需要执行它:
string IDLocation = dgv.SelectedRows[0].Cells[0].Value.ToString();
cmd.CommandText = string.Format("delete from {0} where IDname = @ID", databaseName);
cmd.Parameters.AddWithValue("@ID", IDLocation);
注意,即使在非数字数据类型上,您也不需要引号或任何内容。
和晚上的功能,缺少链接:
cmd.ExecuteNonQuery();
插入查询也是如此 - 确保运行执行方法并使用参数!