2013-01-05 93 views
0


我正在使用Visual Foxpro 8.0數據庫。我正在使用下面的過程來基於條件匹配從數據庫返回記錄,但它引發了「函數未實現」的錯誤。請幫我這是非常迫切......Visual Foxpro數據庫存儲過程與Oledb提供程序

Foxpro的程序------------------------

PROCEDURE FX_Proc_ValidateUser (paramUserName AS Character, paramPassword AS Character) 
LOCAL VarUserName AS Character, varXml 
VarUserName = IIF(VARTYPE(paramUserName)!="N","",paramUserName) 
LOCAL VarPassword AS Character 
VarPassword = IIF(VARTYPE(paramPassword)!="N","",paramPassword) 
SELECT userinfoid, ; 
     username, ; 
     password ; 
FROM tm_userinfo.dbf ; 
WHERE username = VarUserName AND password = VarPassword ; 
INTO CURSOR procResult 
varXml = "" 
CURSORTOXML("procResult","varXml",1,32,0,"1") 
RETURN varXml 
ENDPROC 

前端代碼調用這個程序------------------

string ConnectionString = "Provider=VFPOLEDB.1;Data Source=C:\Users\raj\Documents\Visual FoxPro Projects\dbFoxMaster.dbc;Collating Sequence=machine;" providerName="System.Data.OleDb.OleDbConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; 
OledbConnection objOleDbConnection = new OleDbConnection(ConnectionString); 
objOleDbConnection.Open(); 
OleDbCommand objOleDbCommand = new OleDbCommand(); 
objOleDbCommand.CommandType = CommandType.StoredProcedure; 
objOleDbCommand.CommandText = "FX_Proc_ValidateUser"; 
objOleDbCommand.Connection = objOleDbConnection; 
objOleDbCommand.Parameters.Add("paramUserName", OleDbType.Char).Value = "abc"; 
objOleDbCommand.Parameters.Add("paramPassword", OleDbType.Char).Value = "123"; 
var xmlString = oOleDbCommand.ExecuteScalar().ToString(); 
    DataTable table = new DataTable(); 
    using (var reader = new StringReader(xmlString)) 
    { 
     var dataSet = new DataSet(); 

     // creating a dataset from the xml 
     dataSet.ReadXml(reader); 
     table = dataSet.Tables[0]; 
    } 

請告訴我如何使用的OleDbCommand從FoxPro 8.0存儲過程得到結果集, 感謝

+1

也許這個鏈接可以幫助:http://support.microsoft.com/kb/299820 – rene

+0

請建議我... – Shoeb

回答

0

我沒有VFP,最後一次使用VFP時,它仍然是版本sion 3.0 ...

我會根據規格here來嘗試這樣的事情。要了解其餘讀盤here

PROCEDURE insertData (pusername, ppassword) 

        SELECT userinfoid, username, password 
        FROM tm_userinfo.dbf 
        WHERE username = pusername AND password = ppassword 
        INTO ARRAY results 
    RETURN results 
ENDPROC 
+0

謝謝rene幫助,我用你的過程,但它只返回記錄的唯一鍵,而如果條件匹配,我必須從數據庫返回結果集。我已經更新了我的問題,請再次看到並幫助我..再次感謝 – Shoeb

+0

嗨,Rene,請告訴我如何從foxpro存儲過程使用OledbCommand得到結果集謝謝 – Shoeb

0

一個Visual FoxPro存儲過程基本上是使用Visual FoxPro代碼來執行任務,如插入,更新或刪除驗證列。

例如,您可以將下面的代碼添加到VFP數據庫中的存儲過程來驗證「狀態」欄:

PROCEDURE ValidateState() 
IF address.state <> [OH] 
    MESSAGEBOX([Incorrect State value!], 48, [Invalid State]) 
ENDIF 
ENDPROC 

對於FoxPro數據庫查詢表,你可能想看看創建本地觀點。您可以在foxpro數據庫中右鍵單擊並選擇「新建本地視圖」,然後使用查詢生成器定義您的視圖。在「過濾器」選項卡的「示例」列下,可以使用「?」定義參數如「?pusername」。

這裏是你將如何調用視圖從您的FoxPro代碼:

LOCAL pusername AS Integer 
pusername = "SomeUserName" &&Use this to filter the view 
SELECT 0 
USE MyViewName  &&This will call the view and perform the filter. 

您也可以使這些觀點更新,並且對視圖進行插入的。

+0

嗨,傑裏,我面臨從foxpro數據庫獲取結果集的問題。請看我更新的問題...並幫助我。 – Shoeb

2

它看起來像問題是你把你的結果放到一個數組中,只有數組中的第一項被返回。您應該更改存儲過程,以便它使用遊標。

VFP9例

下面是從northwind.dbc存儲過程例如: enter image description here

下面是使用C#調用存儲過程的一個例子:

var northwindDbcPath = @"C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Northwind\Northwind.dbc"; 
var connectionString = "Provider=VFPOLEDB.1;Data Source=" + northwindDbcPath; 
var table = new DataTable(); 

using(var connection = new OleDbConnection(connectionString)) { 
    using(var command = connection.CreateCommand()) { 
     command.CommandType = CommandType.StoredProcedure; 
     command.CommandText = "CustOrdersDetail"; 
     command.Parameters.Add("x", 10248); 

     var adapter = new OleDbDataAdapter(command); 

     adapter.Fill(table); 
    } 
} 

VFP8實施例: (我沒有VFP8的副本,但我相信這會起作用) enter image description here

var northwindDbcPath = @"C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Northwind\Northwind.dbc"; 
var connectionString = "Provider=VFPOLEDB.1;Data Source=" + northwindDbcPath; 
DataTable table; 

using(var connection = new OleDbConnection(connectionString)) { 
    using(var command = connection.CreateCommand()) { 
     command.CommandType = CommandType.StoredProcedure; 
     command.CommandText = "CustOrdersDetail2"; 
     command.Parameters.AddWithValue("x", 10248); 

     connection.Open();  
     // executing stored procedure and getting xml result 
     var xml = command.ExecuteScalar() as string; 

     connection.Close(); 

     using(var reader = new StringReader(xml)) { 
      var dataSet = new DataSet(); 

      // creating a dataset from the xml 
      dataSet.ReadXml(reader); 
      table = dataSet.Tables[0]; 
     } 
    } 
} 
+0

謝謝湯姆兄弟,這個過程是有意義的,但我使用Visual FoxPro 8.0,所以這裏SETRESULTSET()不支持。當我使用Oledb提供程序訪問過程時,它引發錯誤:「文件'setresultset.prg'不存在」。請建議我這是緊急的。 – Shoeb

+0

我加了一個VFP8的例子。 –

+0

感謝湯姆兄弟做出這些努力,但通過使用你的新過程和它的消費風格,我得到一個新的異常,「調用函數沒有執行」,同時調試行command.ExecuteScalar()。 – Shoeb