2012-05-17 50 views
3

下面是我的選擇*功能的代碼 - 它工作得很好,直到我的SQL字符串從改變選擇*從公司SQL - 的OleDbCommand不改變SQL參數

 query = "Select * From @1"; 

,然後做一切偉大請執行下列操作

 query = "Select * From @1"; 
     OleDbCommand Command = new OleDbCommand(query, sqlConnStr); 

     DataTable Table = new DataTable(); 
     DataSet dataSet = new DataSet(); 
     Table = null; 

     //Add Parameters 
     Command.Parameters.AddWithValue("@1", SQLTables.Company); 

     try 
     { 
      Command.ExecuteNonQuery(); 
      adapter.SelectCommand = Command; 
      adapter.Fill(dataSet); 
      Table = dataSet.Tables[0]; 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("A Error occured whilst trying to execute the command.\n" + e.Message); 
     } 

     return Table; 

的DBMS不斷髮回「查詢不完整」 - 我假設Command變量通過不改變霸發送串query rameter從@1Company


這裏是一個片碼(礦),其中這確實工作。這是一個插入語句,而一個選擇 - 糾正我,如果我錯了,但它應該不是也與SELECT工作藏漢

private void MainActionsInsert(string Action, bool Checked) 
{ 
    OleDbCommand Command = new OleDbCommand("INSERT INTO MainActions Values (ID, Action, BoolValue)", DataBaseConnection); 
    //Add Parameters 
    Command.Parameters.AddWithValue("ID", GenerateID()); 
    Command.Parameters.AddWithValue("Action", Action); 
    Command.Parameters.AddWithValue("BoolValue",Checked); 
    //Add Command 
    MainActionsAdapter.InsertCommand = Command; 
    //Execute Agains DataBase 
    Command.ExecuteNonQuery(); 
    //Accept Changes 
} 

`

+0

工作。親切的問候Markus – Markus

+1

嘗試使用'?'而不是'@'per http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx –

+0

現在我得到''錯誤試圖執行FROM子句「' – Markus

回答

1

OleDbCommand是否接受參數化SQL只是不在From子句 - 它必須在WHERE子句或類似的東西。就像你說的那樣,它使用插入功能,因爲它預計在那裏有「參數」。例如,這將工作

query = "Select * From Company Where @param = 1"; 
    OleDbCommand Command = new OleDbCommand(query, sqlConnStr); 

    DataTable Table = new DataTable(); 
    DataSet dataSet = new DataSet(); 
    Table = null; 

    //Add Parameters 
    Command.Parameters.AddWithValue("param", "ID"); 

    try 
    { 
     Command.ExecuteNonQuery(); 
     adapter.SelectCommand = Command; 
     adapter.Fill(dataSet); 
     Table = dataSet.Tables[0]; 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show("A Error occured whilst trying to execute the command.\n" + e.Message); 
    } 

    return Table; 

搞笑的是,如果我的問題是制定嚴重,請不要猶豫,改變它,它不會爲Select一部分,儘管

+1

我不能相信它,但它確實工作 - 我已經在這個小時,最後現在我明白了。謝謝 – Markus

4

OLEDB無法識別命名參數。您必須在查詢文本中使用?

但是,您也不能使用具有參數化查詢的動態表名,所以即使使用?也無濟於事。

您需要使用完整的dynamic SQL,儘管這可以爲您打開SQL注入。確保你閱讀了我鏈接的完整文章。

+2

......不同類型的執行,儘管動態SQL應儘可能避免。這是一個性能問題,也可能是一個安全問題;一般來說,只需要管理任務就需要使用動態sql。其餘時間往往表明設計不好。 –