为了账号安全,请及时绑定邮箱和手机立即绑定

Visual FoxPro 9 C# OleDbAdapter 插入 - 功能不可用

Visual FoxPro 9 C# OleDbAdapter 插入 - 功能不可用

C#
慕码人2483693 2021-11-28 16:30:38
如何newid("tablename")使用Microsoft 的 OLE DB Provider for Visual Foxpro 9.0的主键插入 FoxPro 表?我有两个表,一个主键的默认值是newid("tablename"),另一个表的数据类型设置为Integer (AutoInc)。当我尝试insert在newid桌子上运行相同的命令时,我得到以下信息OleDbException:Feature is not available当我以主键insert在表上运行时Integer (AutoInc),它可以工作。这是我试图执行的代码: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();    }}insert由于此newid()默认值,OLE 是否有任何原因无法执行?解决我的问题的另一种情况是,如果我id在insert子句中手动指定了一个。前任: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在这张桌子上运行 a 。select 片段: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;}
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

它显示了罪魁祸首是什么。


尽管我的神经倾向于对该代码进行许多更正,但我只会进行足够的修改以使其在 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。


查看完整回答
反对 回复 2021-11-28
?
白板的微信

TA贡献1883条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2021-11-28
  • 2 回答
  • 0 关注
  • 284 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信