2014-02-11 3 views
1

Я попытался скопировать данные из 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(); 

    } 
+2

Я не думаю, что вы можете использовать параметр как табличное имя. Параметры - это заполнители для значений данных, а не для имен объектов. – David

+0

@ пользователь .. переменная, которую вы добавляете, является переменной таблицы .. именно поэтому вы получаете ошибку. –

+0

возможное дублирование: http://stackoverflow.com/questions/17428684/dynamic-table-name-in- select-statement –

ответ

5

Имя таблицы в предложении SQL FROM не является выражением, и поэтому не может быть отправлен в параметр.

Вам необходимо построить строку SQL вручную, например.

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

I сильно рекомендуется разграничивать имя таблицы для предотвращения атак SQL-инъекции.

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

Большое спасибо Sir – user3107343

1

Попробуйте следующее; Замените код SqlCommand на этот код

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

И удалите строку, в которую вы добавляете параметр. Он должен работать так. Вы не можете использовать синтаксис @Parameter для таблиц.

+1

Это уязвимость SQL-инъекций. По крайней мере имена объектов базы данных должны быть заключены (с использованием квадратных скобок в SQL Server). – David

4

Вы не можете использовать синтаксис @Parameter для таблиц; лучший способ, как сделать это, чтобы закрыть имя таблицы в [] и проверить, если имя таблицы не содержит [] (SQL Injection предосторожность)

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

Смежные вопросы