使用ListBox选择表

问题描述 投票:0回答:1

我正在尝试读取SQL语句中的表。表的名称被拉到列表框中。

用户将选择要查看其数据的表的名称,而我的方法将依次读取+可视化+导出该表。

问题在于表名是动态值。最初,我是用IronPython编写代码的,而且还可以。

现在我将其翻译为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”。

如果我使用静态表名,则一切正常。

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

非常感谢您的帮助。

c# sql sql-server tsql ado.net
1个回答
0
投票

您不能将TableName用作SqlCommand的参数

更改sql查询,像这样的somthig:

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

OR

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

但是要小心SQL注入攻击!

最好的方法是使用表名称作为参数的存储过程来处理动态SQL查询

© www.soinside.com 2019 - 2024. All rights reserved.