使用 odbc 或 oledb 从可视化 Foxpro 数据库中的 c# 代码添加存储过程

Add a Store Procedure from c# code in visual Fox Pro database using odbc or vfoledb

我有一个 Visual Fox Pro 数据库,我需要在其中添加一个存储过程(如果它不存在的话)。我可以使用 VFP 添加存储过程,但我想在没有用户交互的情况下进行。

try
        {
            using (OdbcConnection conn = new OdbcConnection("Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;Exclusive=No;Collate=Machine;NULL=NO;DELETED=YES;BACKGROUNDFETCH=NO;SourceDB=" + dbpath + "/sample.dbc"))
            {


            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);

        }

以上是我打开数据库的代码。下面是示例存储过程

Function GetMax( tcTableName, tcFieldName )
Local Array laMax[1]
Select Max( &tcFieldName ) ;
    from (m.tcTableName) ;
    into Array laMax
Return laMax[1]
Endfunc

恕我直言,您应该使用 VFP 来做到这一点。您可以尝试使用 ExecScript,但我怀疑它是否有效(我没试过)。

编辑:我出于好奇尝试了这个,令我惊讶的是它起作用了:

static void Main()
{
string myCode = 
@"procedure SPTest(tcTableName)
select * from (m.tcTableName) into cursor crsTest nofilter
setresultset('crsTest')
endproc";

File.WriteAllText(@"d:\temp\TestSP.prg",myCode);

  string strCon = @"Provider=VFPOLEDB;Data Source=d:\temp";
  using(  OleDbConnection con = new OleDbConnection(strCon))
  {
    con.Open();    
    var xs = new OleDbCommand("TestSP", con);
    xs.CommandType = CommandType.StoredProcedure;
    xs.ExecuteNonQuery();

    var cmd = new OleDbCommand(@"update ('d:\temp\TestSP.dbc') 
      set Code = ? where ObjectName='StoredProceduresSource'", con);
    cmd.Parameters.AddWithValue("spCode", myCode);  
    cmd.ExecuteNonQuery();
    cmd = new OleDbCommand(@"update ('d:\temp\TestSP.dbc') 
      set Code = ? where ObjectName='StoredProceduresObject'", con);
    cmd.Parameters.AddWithValue("spCode", File.ReadAllBytes(@"d:\temp\TestSP.fxp"));  
    cmd.ExecuteNonQuery();
    con.Close();
   } 

   DataTable tbl = new DataTable();
   using(OleDbConnection con = new OleDbConnection(@"Provider=VFPOLEDB;Data Source=d:\temp\TestSP.dbc"))
   {
    var cmd = new OleDbCommand("spTest");
    cmd.Connection = con;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("spCode", @"d:\temp\MyCustomers");  
    con.Open();
    tbl.Load(cmd.ExecuteReader());
    con.Close();
   }
   // LinqPad
   // tbl.Dump();
}