private void button1_Click(object sender, EventArgs e)
{
string tablename = label2.Text;
string name = TextBox1.Text;
DBconnection.savetodb(tablename, name);
}
我从另一个表单调用下面的方法将名称保存到特定的表中。但它不会保存在我的数据库表中。
public static void savetodb(string tablename, string name)
{
OleDbConnection connection = GetConnection();
string query = String.Format("INSERT INTO {0} (Name) VALUES (@Name)", tablename);
OleDbCommand cmd = new OleDbCommand(query, connection);
cmd.Parameters.AddWithValue("@Name", name);
try{
connection.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex){
Console.WriteLine("Exception catch", ex);
}
finally{
myConnection.Close();
}
感谢您的帮助。
答案 0 :(得分:1)
您没有将表名作为参数传递,而是将@Name
值作为参数传递。如果需要,您不能将表名作为参数甚至传递。参数仅适用于值,不适用于表名或列名。您只是格式化基于查询的表名称。据我所知,你的问题使用命名参数。 OleDb提供程序不支持命名参数。
OLE DB .NET提供程序不支持传递的命名参数 SQL语句或由a调用的存储过程的参数 CommandType设置为Text时的OleDbCommand。在这种情况下, 必须使用问号(?)占位符。例如:
SELECT * FROM Customers WHERE CustomerID =?
因此,将OleDbParameter对象添加到的顺序 OleDbParameterCollection必须直接对应于的位置 命令文本中参数的问号占位符。
尝试为;
string query = String.Format("INSERT INTO {0} (Name) VALUES (?)", tablename);
...
cmd.Parameters.AddWithValue("@name", name);
还可以使用using
statement来处置您的OleDbConnection
和OleDbCommand
。
using(OleDbConnection connection = new GetConnection())
using(OleDbCommand cmd = con.CreateCommand())
{
}
并考虑使用.Add
method代替.AddWithValue
。这可能会导致一些问题。阅读Can we stop using AddWithValue() already?