2012-07-20 65 views
1

我試着去得到一個簡單的SQL語句在我的代碼,並獲得了DataTable,出於某種原因,我得到這個奇怪的例外:無效的列名例外

無效的列名

這是我的代碼:

public DataTable GetAllVideoID(string stringId) 
    { 
     dt = new DataTable(); 
     dataObj = new DataObj(); 
     sql = "SELECT * FROM TBL_VIDEOS WHERE TBL_VIDEOS.ID=" + stringId; 

     return dt = dataObj.SelectDataTable(sql); 
    } 

public DataTable SelectDataTable(string sql) 
    { 
     try 
     { 
      conn = new SqlConnection(conString); 
      conn.Open(); 
      adapter = new SqlDataAdapter(sql, conn); 

      dt = new DataTable(); 

      adapter.Fill(dt); 



      return dt; 
     } 
     catch (Exception e) 
     { 

      throw e; 
     } 
     finally { conn.Close(); } 

    } 

當我在我的管理工具來運行這個,只是statemnet - 它完美。 所以我不知道..我的DB的

結構: ID,TITLE,V_DESCIPTION,UPLOAD_DATE,V_VIEW,USERNAME,評價,V_SOURCE,FLAG

謝謝:)

+0

?也許一列或多列有保留字/關鍵字等? – 2012-07-20 21:30:58

+0

@AaronBertrand,當然,編輯我的問題:) – thormayer 2012-07-20 21:33:54

+7

使用sql-parameters來避免sql注入。旁註:您在使用DataAdapter時不必打開/關閉連接。 「填充」將隱式打開/關閉。不要拋出異常,而只拋出保持堆棧跟蹤。 – 2012-07-20 21:34:21

回答

4

改變你的SQL

sql = "SELECT * FROM TBL_VIDEOS WHERE TBL_VIDEOS.ID='" + stringId+"'"; 

可以解決這個問題。這會在stringId的值的周圍放一個單引號。 .ID = '10'

如果的StringID =「用戶」您的查詢就會成爲

sql = "SELECT * FROM TBL_VIDEOS WHERE TBL_VIDEOS.ID=user 
instead of 
sql = "SELECT * FROM TBL_VIDEOS WHERE TBL_VIDEOS.ID = 'user' 

,但用戶不能在SQL有效的變量,所以你得到無效的列名

+0

謝謝。好像我想傳遞一個字符串,而不是一個int。 – thormayer 2012-07-20 22:02:20

+3

@thormayer你的列名是非常混亂的。ID通常不是一個字符串。(我們也並不真的需要一個TBL_前綴知道一個表是。) – 2012-07-20 22:07:11

0

SelectDataTable方法是絕對的罰款。 它在我腦海中的唯一一件事就是更換此:你能告訴我們`TBL_VIDEOS`的表結構

sql = "SELECT * FROM TBL_VIDEOS WHERE TBL_VIDEOS.ID=" + stringId; 

通過

sql = string.Format("SELECT * FROM TBL_VIDEOS WHERE TBL_VIDEOS.ID 
     = '{0}'", stringId);