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

如何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;

}


慕码人2483693
浏览 285回答 2
2回答

智慧大石

它显示了罪魁祸首是什么。尽管我的神经倾向于对该代码进行许多更正,但我只会进行足够的修改以使其在 VFP 和 C# 中都能正常工作:function newIdparameter thisdbfregional keynm, newkey, nOldSelect, lDonekeynm=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.    endifenddoSelect (m.nOldSelect)return newkey改变的部分只与那个有关(if !empty(...)) block。

白板的微信

问题是存储过程中的这个变量声明行: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
打开App,查看更多内容
随时随地看视频慕课网APP