必须声明表变量@table

Raf*_*del 10 c# sql console-application

我是C#和SQL的初学者,我有这个我要执行的SQL插入语句.它要求我要插入的其他变量中的表名.

但是,当我运行此控制台应用程序时,我收到此错误:

必须声明表变量@table

这是代码的一部分:

StreamReader my_reader =  getFile(args);
string CS = formCS();
try
{
    using (SqlConnection con = new SqlConnection(CS))
    {
        SqlCommand com = new SqlCommand("insert into @table (time, date, pin) values (@time, @date, @pin)", con);                    
        con.Open();
        Console.WriteLine("Enter table name:");
        Console.Write(">> ");
        string tblname = Console.ReadLine();
        com.Parameters.AddWithValue("@table", tblname);

        string line = "";
        int count = 0;
        while ((line = my_reader.ReadLine()) != null)
        {
            Dictionary<string, string> result = extractData(line);                        
            com.Parameters.AddWithValue("@time", result["regTime"]);
            com.Parameters.AddWithValue("@date", result["regDate"]);
            com.Parameters.AddWithValue("@pin", result["regPin"]);
            count += com.ExecuteNonQuery();
            com.Parameters.Clear();                        

        }
        Console.WriteLine("Recoreds added : {0}", count.ToString());
        Console.WriteLine("Press Enter to exit.");
    }
    Console.ReadLine();
}
catch (SqlException ex)
{
    Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);                
}
Run Code Online (Sandbox Code Playgroud)

Mah*_*mal 15

你不能这样做.您不能像以下那样将表名作为参数传递:

SqlCommand com = new SqlCommand("insert into @table ...");
...
com.Parameters.AddWithValue("@table", tblname);
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

Console.WriteLine("Enter table name:");
Console.Write(">> ");
string tblname = Console.ReadLine();

string sql = String.Format("insert into {0} (time, date, pin) values ... ", tblname);

SqlCommand com = new SqlCommand(sql, con);                    

...
Run Code Online (Sandbox Code Playgroud)

  • @RafaelAdel是的.您应该检查`tblname`是否是数据库中的表(`SELECT*FROM INFORMATION_SCHEMA.TABLES`). (5认同)
  • 这是否允许以任何方式进行sql注入? (4认同)
  • @RafaelAdel,我检查[和]的表名.如果它包含然后停止.然后将表名括在[]中. (2认同)

小智 5

表名不能是sql查询中的输入参数。但是,您始终可以“按照以下步骤将其传递给SqlCommand之前,准备sql字符串:

var sqlString = string.Format("insert into {0} (time, date, pin) values (@time, @date, @pin)", tblname) 
Run Code Online (Sandbox Code Playgroud)

然后

SqlCommand com = new SqlCommand(sqlString);
...
Run Code Online (Sandbox Code Playgroud)