복붙노트

[SQL] 테이블 변수 @table를 선언해야합니다

SQL

테이블 변수 @table를 선언해야합니다

나는 C # 및 SQL에 초보자 해요, 제가 수행하도록이 SQL 삽입 문이있다. 내가 삽입 할 다른 변수들 사이의 테이블 이름을 요청합니다.

내가이 콘솔 응용 프로그램을 실행할 때 나는이 오류가 발생합니다 :

이 코드의 일부입니다 :

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

해결법

  1. ==============================

    1.당신은이 작업을 수행 할 수 없습니다. 당신은 매개 변수로 당신이 한 길을 테이블 이름을 전달할 수 없습니다 :

    당신은이 작업을 수행 할 수 없습니다. 당신은 매개 변수로 당신이 한 길을 테이블 이름을 전달할 수 없습니다 :

    SqlCommand com = new SqlCommand("insert into @table ...");
    ...
    com.Parameters.AddWithValue("@table", tblname);
    

    대신이 작업을 수행 할 수 있습니다

    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);                    
    
    ...
    
  2. ==============================

    2.테이블 이름은 SQL 쿼리에 입력 매개 변수가 될 수 없습니다. 그러나, 당신은 항상 "다음과 같이하는 SqlCommand에 전달하기 전에 SQL 문자열을 준비 할 수 있습니다 :

    테이블 이름은 SQL 쿼리에 입력 매개 변수가 될 수 없습니다. 그러나, 당신은 항상 "다음과 같이하는 SqlCommand에 전달하기 전에 SQL 문자열을 준비 할 수 있습니다 :

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

    그리고

    SqlCommand com = new SqlCommand(sqlString);
    ...
    
  3. ==============================

    3.이 시도...

    이 시도...

    string tblname = "; DROP TABLE users;";
    var sqlString = string.Format("insert into {0} (time, date, pin) values (@time, @date, @pin)", tblname)
    

    https://en.wikipedia.org/wiki/SQL_injection

  4. from https://stackoverflow.com/questions/14003241/must-declare-the-table-variable-table by cc-by-sa and MIT license