如何在OleDB中将表名作为参数传递?

时间:2014-11-07 07:50:53

标签: c# oledb

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();
        }

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您没有将表名作为参数传递,而是将@Name值作为参数传递。如果需要,您不能将表名作为参数甚至传递。参数仅适用于值,不适用于表名或列名。您只是格式化基于查询的表名称。据我所知,你的问题使用命名参数。 OleDb提供程序不支持命名参数。

来自OleDbCommand.Parameters

  

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来处置您的OleDbConnectionOleDbCommand

using(OleDbConnection connection = new GetConnection())
using(OleDbCommand cmd = con.CreateCommand())
{

}

并考虑使用.Add method代替.AddWithValue。这可能会导致一些问题。阅读Can we stop using AddWithValue() already?