gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:33:01 28 4
gpt4 key购买 nike

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

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

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

功能不可用

当我在以 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();
}
}

OLE 是否因为这个 newid() 默认值而无法执行 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

选择片段:

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"

最佳答案

感谢分享 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 有关。

关于c# - Visual FoxPro 9 C# OleDbAdapter 插入 - 功能不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844088/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com