如何使用Microsoft's OLE DB Provider for Visual Foxpro 9.0使用默认值为newid("tablename")的主键插入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默认值,OLE是否有任何原因无法执行newid()



解决我的问题的另一种情况是,如果我在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

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上运行插入)。

以下原因导致我的存储过程在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/

10-09 01:08