2012-12-22 8 views
6

घोषित करना चाहिए मैं सी # और एसक्यूएल में एक नौसिखिया हूं, मेरे पास यह SQL सम्मिलन कथन है जिसे मैं निष्पादित करना चाहता हूं। यह उन अन्य चरों के बीच तालिका नाम मांगता है जिन्हें मैं सम्मिलित करना चाहता हूं।तालिका परिवर्तनीय @table

तालिका चर @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);     
} 
+5

किसी वैरिएबल के रूप में आपके सम्मिलित स्टेटमेट का टेबल नाम रखने की अनुमति नहीं है। अगर आपको कुछ चाहिए तो sp_exec में देखें उस। – rene

उत्तर

11

लेकिन मैं इस त्रुटि मिलती है जब मैं इस कंसोल अनुप्रयोग चलाने आप यह नहीं कर सकते

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

... 
+3

क्या यह किसी भी तरह से एसक्यूएल इंजेक्शन की अनुमति देता है? –

+3

@ राफेलएडेल हां यह करता है। आपको जांचना चाहिए कि क्या आपके डेटाबेस में 'tblname' एक तालिका है (' चुनें * जानकारी से CHCHLESA.TABLES')। – ctusch

+2

@ राफेलएडेल, मैं टेबल नाम [और] के लिए जांचता हूं। यदि इसमें या तो बंद है तो रोकें। फिर तालिका नाम को [] में संलग्न करें। –

4

तालिका नाम एक एसक्यूएल क्वेरी में एक इनपुट पैरामीटर नहीं किया जा सकता है आप एक पैरामीटर के रूप रास्ता तुमने किया था तालिका नाम से पारित नहीं कर सकते हैं। हालांकि, आप हमेशा "एसक्यूएल स्ट्रिंग यह SqlCommand को पार करने से पहले निम्न अनुसार तैयारी करें कर सकते हैं:

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

और फिर

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