2014-02-11 139 views
1

我試着將數據從DB1複製到DB2.But我得到錯誤:必須聲明表變量「@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(); 

    } 
+2

我不認爲你可以使用參數作爲這樣的表名。參數是數據值的佔位符,而不是對象名稱。 – David

+0

@ user ..你正在添加的變量是一個表變量..這就是爲什麼你得到錯誤.. –

+0

可能的重複:http://stackoverflow.com/questions/17428684/dynamic-table-name-in- select語句 –

回答

5

表名在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); 
+0

非常感謝您 – user3107343

1

請嘗試以下;將您的SqlCommand代碼替換爲此

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

並刪除要添加參數的行。它應該像這樣工作。您不能對錶使用@Parameter語法。

+1

這是一個SQL注入漏洞。至少應該包含數據庫對象名稱(在SQL Server中使用方括號)。 – David

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); 
0

可能是你可以試試這個:

公共無效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); 

    . 
    . 


} 

希望這有助於..

+1

爵士這是一個SQL注入漏洞。至少應該包含數據庫對象名稱(在SQL Server中使用方括號)。 – David