必须声明表变量“@”。

时间:2014-02-11 10:54:23

标签: c#

我尝试将数据从DB1复制到DB2。但是我得到错误:必须声明表变量“@TableName”。

这段代码有什么问题?

功能:

  public void TransferData()


    {
        SqlConnection source = new SqlConnection(strConnectDB1);
        SqlConnection destination = new SqlConnection(strConnectDB2);


        source.Open();
        destination.Open();

        SqlCommand cmd= new SqlCommand("SELECT * FROM @TableName", source);

        cmd.Parameters.AddWithValue("@TableName", listbox1.SelectedItem.ToString());
        SqlDataReader reader = cmd.ExecuteReader();


        SqlBulkCopy bulkData = new SqlBulkCopy(destination);

        bulkData.DestinationTableName = listbox1.SelectedItem.ToString();

        bulkData.WriteToServer(reader);

        .
        .


    }

按钮:

    private void button5_Click(object sender, EventArgs e)
    {
        CreateTableName();

        TransferData();

    }

4 个答案:

答案 0 :(得分:7)

SQL FROM子句中的表名不是表达式,因此无法在参数中发送。

您需要手动构建SQL字符串,例如

SqlCommand cmd = new SqlCommand(string.Format("SELECT * FROM {0}", listbox1.SelectedItem), source);

强烈 建议您分隔表名以防止SQL注入攻击。

SqlCommand cmd = new SqlCommand(string.Format("SELECT * FROM {0}", "[" + listbox1.SelectedItem.ToString().Replace("]", "]]") + "]"), source);

答案 1 :(得分:4)

您不能对表使用@Parameter语法;最好的方法是将表名关闭到[]并检查表名是否不包含[](sql注入预防措施)

  if (listbox1.SelectedItem.Contains("[") 
     || listbox1.SelectedItem.Contains("]") {
     throw new Exception("Invalid table name");
  }

  SqlCommand cmd= new SqlCommand(string.Format(
    "SELECT * FROM [{0}]",listbox1.SelectedItem), source);

答案 2 :(得分:1)

尝试以下方法;将您的SqlCommand代码替换为此

  SqlCommand cmd= new SqlCommand("SELECT * FROM " + listbox1.SelectedItem.ToString(), source);

然后删除要添加参数的行。它应该像这样工作。您不能对表使用@Parameter语法。

答案 3 :(得分:0)

可以试试这个:

public void TransferData()

{

    string strTableName=string.empty;
    SqlConnection source = new SqlConnection(strConnectDB1);
    SqlConnection destination = new SqlConnection(strConnectDB2);


    source.Open();
    destination.Open();

    SqlCommand cmd= new SqlCommand("SELECT * FROM"+strTableName, source);

    strTableName=listbox1.SelectedItem.ToString());
    SqlDataReader reader = cmd.ExecuteReader();


    SqlBulkCopy bulkData = new SqlBulkCopy(destination);

    bulkData.DestinationTableName = listbox1.SelectedItem.ToString();

    bulkData.WriteToServer(reader);

    .
    .


}

希望这会有所帮助..