使用 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();
}
我有一个 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();
}