2008-09-30 223 views
1

我有一個DataGrid和適配器,通過一個存儲的查詢與MSACCESS表對應的工作(名爲「UpdatePaid」,3個PARAMATERS如下圖所示),像這樣:爲什麼我需要OleDbCommand.Prepare()?

OleDbCommand odc = new OleDbCommand("UpdatePaid", connection); 

    OleDbParameter param; 

    odc.CommandType = CommandType.StoredProcedure; 

    param = odc.Parameters.Add("v_iid", OleDbType.Double); 
    param.SourceColumn = "I"; 
    param.SourceVersion = DataRowVersion.Original; 

    param = odc.Parameters.Add("v_pd", OleDbType.Boolean); 
    param.SourceColumn = "Paid"; 
    param.SourceVersion = DataRowVersion.Current; 

    param = odc.Parameters.Add("v_Projected", OleDbType.Currency); 
    param.SourceColumn = "ProjectedCost"; 
    param.SourceVersion = DataRowVersion.Current; 

    odc.Prepare(); 

    myAdapter.UpdateCommand = odc; 

    ... 

    myAdapter.Update(); 

它工作正常...但真正奇怪的是,它沒有直到我把在odc.Prepare()調用

我的問題是這樣的:在使用OleDb存儲過程/查詢時,我是否一直需要這麼做?爲什麼?我還有另一個項目,我必須用SqlDbCommand來做同樣的事情......我也必須這樣做嗎?

回答

3

這被稱爲奇怪的是,一個準備好的聲明,他們其實非常好。基本上會發生什麼是你創建或獲得一個SQL語句(插入,刪除,更新),而不是傳遞實際值,你傳遞「?」作爲佔位符。這一切都很好,除了我們想要的是我們的價值觀,而不是「?」。

所以我們準備語句所以不是「?」,我們在傳遞參數,你有上面打算是去代替佔位符的值。

準備解析字符串,找到其中的參數可以取代問號因此,所有你需要做的就是輸入參數數據,並執行命令。

在OLEDB,存儲的查詢是準備語句,所以需要準備。我沒有使用SqlDB存儲的查詢,所以我不得不推遲到以前的2個答案。

0

我不使用它與SqlDbCommand。這對我來說似乎是一個錯誤,它需要需要。如果您打算連續多次調用一個過程,那麼應該只有。也許我錯了,關於提供商的文檔中有一個註釋,它們太喜歡這個調用。

0

您是否正在使用JET OLEDB提供程序?或者MSDASQL + JET ODBC?

你不應該需要調用Prepare(),但我相信這是驅動器/供應商依賴。

你絕對不需要使用Prepare()System.Data.SqlClient