【发布时间】: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