我尝试将数据从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();
}
答案 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);
.
.
}
希望这会有所帮助..