【问题标题】:Visual FoxPro 9 C# OleDbAdapter Insert - Feature is Not AvailableVisual FoxPro 9 C# OleDbAdapter 插入 - 功能不可用
【发布时间】:2018-08-14 14:42:58
【问题描述】:

如何使用Microsoft's OLE DB Provider for Visual Foxpro 9.0 插入具有默认值为newid("tablename") 的主键的 FoxPro 表?

我有两张表,一张的主键默认值为newid("tablename"),另一张的数据类型设置为Integer (AutoInc)

当我尝试在newid 表上运行相同的insert 命令时,我得到以下OleDbException

Feature is not available

当我在以Integer (AutoInc) 作为主键的表上运行insert 时,它可以工作。

这是我要执行的代码:

public void InsertData()
{
    using(var connectionHandler = new OleDbConnection("Provider=VFPOLEDB.1;Data Source=\"C:\\path\\to\\db.dbc\";"))
    {
        var insertStatement = @"INSERT INTO mytable (mycol) values (?)";

        var insertCommand = new OleDbCommand(insertStatement, connectionHandler);

        insertCommand.Parameters.Add("mycol", OleDbType.Char).Value="blue";

        connectionHandler.Open();
        insertCommand.ExecuteNonQuery();
        connectionHandler.Close();
    }
}

由于这个newid() 默认值,OLE 是否有任何原因无法执行insert


解决我的问题的另一种情况是,如果我在 insert 子句中手动指定 id。例如:

var insertStatement = @"INSERT INTO mytable (id, mycol) values (?, ?)";
insertCommand.Parameters.Add("id", OleDbType.Integer).Value = 199;
insertCommand.Parameters.Add("mycol", OleDbType.Char).Value = "blue";

另外,我可以在这张桌子上运行select * from tablename

selectsn-p:

public DataTable GetData()
{
    var myData = new DataTable();

    using(var connectionHandler = new OleDbConnection("Provider=VFPOLEDB.1;Data Source=\"C:\\path\\to\\db.dbc\";"))
    {       
        var da = new OleDbDataAdapter();
        var mySQL = "select * from mytable";

        var myQuery = new OleDbCommand(mySQL, connectionHandler);
        connectionHandler.Open();

        da.SelectCommand = myQuery;

        da.Fill(myData);

        connectionHandler.Close();
    }

    return myData;
}

newid()SP:

function newId
parameter thisdbf
regional keynm, newkey, cOldSelect, lDone
keynm=padr(upper(thisdbf),50)
cOldSelect=alias()
lDone=.f.
do while not lDone
    select keyvalue from main!idkeys where keyname=keynm into array akey
    if _tally=0
        insert into main!idkeys (keyname) value (keynm)
        loop
    endif
    newkey=akey+1
    update main!idkeys set keyvalue=newkey where keyname=keynm and keyvalue=akey
    if _tally=1
        lDone=.t.
    endif
enddo
if not empty(cOldSelect)
    select &cOldSelect
else
    select 0
endif
return newkey

在单独的存储过程中,我尝试了以下方法来隔离关键字regional

FUNCTION GetHello

regional hello

RETURN "HELLO WORLD"

这似乎可行(例如,将列的默认值设置为 GetHello(),然后在 OLEDB 上运行插入)。

以下导致我的存储过程在 OLEDB 上失败并显示“功能不可用”:

FUNCTION GetHello
LOCAL test
test="select * from customer"
&test
RETURN "hello"

【问题讨论】:

  • 确认newid是数据库中的存储过程。
  • 是的,newid是db中的一个存储过程
  • NewId() 存储过程中是否有不受OLEDB 支持的代码?支持的 VFP 命令位于帮助文件或此处:yaldex.com/fox_pro_tutorial/html/…
  • 能分享一下newid()的代码吗?
  • 用 newid() 代码更新

标签: c# oledb visual-foxpro foxpro


【解决方案1】:

感谢分享 SP 代码!它显示了罪魁祸首。

虽然我的神经倾向于对该代码进行许多更正,但我只会进行足够的修改以使其在 VFP 和 C# 中都能正常工作:

function newId
parameter thisdbf
regional keynm, newkey, nOldSelect, lDone
keynm=padr(upper(thisdbf),50)
nOldSelect=select()
lDone=.f.
do while not lDone
    select keyvalue from main!idkeys where keyname=keynm into array akey
    if _tally=0
        insert into main!idkeys (keyname) value (keynm)
        loop
    endif
    newkey=akey+1
    update main!idkeys set keyvalue=newkey where keyname=keynm and keyvalue=akey
    if _tally=1
        lDone=.t.
    endif
enddo
Select (m.nOldSelect)
return newkey

改动部分只和那个(if !empty(...)) block有关。

【讨论】:

  • 感谢您对 Cetin 的帮助!
【解决方案2】:

问题是存储过程中的这个变量声明行:

regional keynm, newkey, cOldSelect, lDone

'regional' 关键字是旧 FoxPro 2.6 for DOS\Windows 的保留。它仅用于屏幕生成器工具生成的程序中。它显然仍然潜伏在 Visual FoxPro 中,以支持将旧 FoxPro 2.6 项目迁移到 Visual FoxPro 的功能,因为代码在 VFP 中运行良好。但是OLEDB驱动不支持。

无论如何,你需要改变你的存储过程来使用:

local keynm, newkey, cOldSelect, lDone

... 并重新编译它,您将需要 Visual FoxPro。确保没有 OLEDB 或其他连接,然后在 Visual FoxPro 命令窗口中:

compile c:\path\to\mydatabase.dbc

【讨论】:

  • 我尝试在 SP 中将 regional 替换为 local,但没有成功...如何在我的数据库 (main.DBC) 中重新编译存储过程?我通过右键单击并选择“编辑存储过程...”来编辑它
  • 使用regional更新了带有工作sn-p的帖子
  • 不会有坏处,不需要改变。罪魁祸首代码是他试图选择以前的工作区域的地方(那会不会是空的?)。
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多