Visual FoxPro 9 C# OleDbAdapter 插入 - 功能不可用
Visual FoxPro 9 C# OleDbAdapter Insert - Feature is Not Available
如何使用 Microsoft's OLE DB Provider for Visual Foxpro 9.0 将默认值为 newid("tablename")
的主键插入到 FoxPro table 中?
我有两个table,一个主键的默认值为newid("tablename")
,另一个的数据类型设置为Integer (AutoInc)
.
当我在 newid
table 上尝试 运行 相同的 insert
命令时,我得到以下 OleDbException
:
Feature is not available
当我 运行 insert
在 table 上以 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();
}
}
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
这个table。
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;
}
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 上插入)。
以下导致我的存储过程因 "Feature is not available" 在 OLEDB 上失败:
FUNCTION GetHello
LOCAL test
test="select * from customer"
&test
RETURN "hello"
问题出在存储过程中的这个变量声明行:
regional keynm, newkey, cOldSelect, lDone
'regional' 关键字是对 DOS\Windows 的旧 FoxPro 2.6 的保留。它仅用于屏幕生成器工具生成的程序。它显然仍然潜伏在 Visual FoxPro 中以支持将旧的 FoxPro 2.6 项目迁移到 Visual FoxPro 的功能,因为代码在 VFP 中运行良好。但是OLEDB驱动不支持
无论如何,您需要更改存储过程以使用:
local keynm, newkey, cOldSelect, lDone
... 并重新编译它,为此您需要 Visual FoxPro。确保没有 OLEDB 或其他连接到它,然后在 Visual FoxPro 命令中 window:
compile c:\path\to\mydatabase.dbc
感谢分享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
有关。
如何使用 Microsoft's OLE DB Provider for Visual Foxpro 9.0 将默认值为 newid("tablename")
的主键插入到 FoxPro table 中?
我有两个table,一个主键的默认值为newid("tablename")
,另一个的数据类型设置为Integer (AutoInc)
.
当我在 newid
table 上尝试 运行 相同的 insert
命令时,我得到以下 OleDbException
:
Feature is not available
当我 运行 insert
在 table 上以 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();
}
}
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
这个table。
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;
}
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 上插入)。
以下导致我的存储过程因 "Feature is not available" 在 OLEDB 上失败:
FUNCTION GetHello
LOCAL test
test="select * from customer"
&test
RETURN "hello"
问题出在存储过程中的这个变量声明行:
regional keynm, newkey, cOldSelect, lDone
'regional' 关键字是对 DOS\Windows 的旧 FoxPro 2.6 的保留。它仅用于屏幕生成器工具生成的程序。它显然仍然潜伏在 Visual FoxPro 中以支持将旧的 FoxPro 2.6 项目迁移到 Visual FoxPro 的功能,因为代码在 VFP 中运行良好。但是OLEDB驱动不支持
无论如何,您需要更改存储过程以使用:
local keynm, newkey, cOldSelect, lDone
... 并重新编译它,为此您需要 Visual FoxPro。确保没有 OLEDB 或其他连接到它,然后在 Visual FoxPro 命令中 window:
compile c:\path\to\mydatabase.dbc
感谢分享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
有关。