Выберите таблицу с помощью ListBox - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь прочитать таблицы в операторе SQL. Имена таблиц извлекаются из списка.

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

Проблема связана с именем таблицы в качестве значения c. Изначально я написал код на Iron Python, и все было в порядке.

Теперь я перевожу этот код на C# и столкнулся с проблемой синтаксиса (очевидно, адрес сервера / логин, размещенный здесь, не реальные).

Имена таблиц заполняются в listBox1 отдельным методом.

private void rEADSELECTEDTABLE_Click(object sender, EventArgs e)
{
    string tableName = listBox1.GetItemText(listBox1.SelectedItem);
    MessageBox.Show(" Table Selected: " + tableName);

    try
    {
        string sqlConnectionString;
        myConnectionString = @"server=000.00.000.0;database=myDatabase;uid=myUser;password=myPassword";

        mySQL = new SqlConnection(myConnectionString);
        mySQL.Open();

        SqlCommand myCommand2 = new SqlCommand("SELECT * FROM @myTable", mySQL);
        SqlParameter param = new SqlParameter();
        param.ParameterName = "@myTable";
        param.Value = tableName;
        myCommand2.Parameters.Add(param);

        SqlDataAdapter myAdapter = new SqlDataAdapter();
        myAdapter.SelectCommand = myCommand2;

        DataSet dataSet = new DataSet();
        myAdapter.Fill(dataSet);

        List<string> rows = new List<string>();
        List<string> rowData = new List<string>();

        foreach (DataTable table in dataSet.Tables)
            foreach (DataRow row in table.Rows)
                foreach (DataColumn column in table.Columns)
                    if (row[column] != null)
                        rowData.Add(row[column].ToString());

        foreach (String s in rowData)
            Console.WriteLine(s);

        mySQL.Close();
    }
}

Когда я запускаю код, я получаю эту ошибку:

System.Data.SqlClient.SqlException (0x80131904): необходимо объявить табличную переменную "@myTable".

Если я использую имя таблицы stati c, все работает хорошо.

SqlCommand myCommand2 = new SqlCommand("SELECT * FROM TABLE_NAME", mySQL);
SqlDataAdapter myAdapter = new SqlDataAdapter();
myAdapter.SelectCommand = myCommand2;

Помощь с благодарностью.

1 Ответ

0 голосов
/ 10 апреля 2020

вы не можете использовать TableName в качестве параметра с SqlCommand

изменить запрос sql, например:

SqlCommand myCommand2 = new SqlCommand("SELECT * FROM " + tableName, mySQL);

ИЛИ

SqlCommand myCommand2 = new SqlCommand(string.Format("SELECT * FROM {0}", tableName), mySQL);

, но будьте осторожны из sql Атака инъекцией!

Другой способ - работать с динамическим c sql запросом с использованием хранимой процедуры и отправлять имя таблицы в качестве параметра

...