【问题标题】:C# Access db complex stored procedure errorC# Access db 复杂存储过程报错
【发布时间】:2013-06-10 09:10:46
【问题描述】:

寻找这个奇怪问题的提示。

我正在尝试将访问 (OleDb) 数据库中的数据检索到 c#/wpf 数据表中。现在有趣的是:一个简单的查询在访问中工作并被下载到数据表中,就好了。一个(稍微)更复杂的查询在 Access 中有效,但在 c# 中出错。

代码如下:

 OleDbConnection conn = new OleDbConnection("myconn");
 DataTable dt = new DataTable();
 OleDbCommand cmd = new OleDbCommand();
 OleDbDataAdapter adapter = new OleDbDataAdapter();

 conn.Open();

       //3 flavors          
       //string n = "QryTestComplex";        This gives an error in c#, works in access
       //string n = "SELECT * FROM CURSIST"; This works ( with cmd.CommandType =  
                                                                   etc, commented out)
       //string n = "QryTestSimple";         This works   ( SQL = same as above )

cmd = new OleDbCommand(n,conn);
cmd.CommandType = CommandType.StoredProcedure;

adapter.SelectCommand = cmd
            try
            {
                adapter.Fill(dt);
                int t = 0;
                foreach (DataRow dr in dt.Rows)
                { t++; Console.WriteLine(t + dr[0].ToString()); }
            }
            catch (Exception exc)
            {
            Console.WriteLine("{0} Exception caught.", exc);
            }

            conn.Close();

查询是:

QryTestSimple:

SELECT * FROM Cursist;

QryTestComplex:

SELECT 
    Module.Status, 
    ModuleData.Datum, 
    LeerActiviteit.Naam, 
    Module.Locatie, 
    Module.Onderwijskundige, 
    Module.Organisator, 
    Module.Coordinator, 
    Module.Stoplicht, 
    Module.ID, Cluster.Naam AS CNaam, 
    (
        SELECT '(dag' & count(M.ID) + 1 & ')'  
        FROM  
            Module AS M  
            INNER JOIN ModuleData AS MD 
                ON M.ID = MD.Module_ID 
        WHERE Module.ID = M.ID 
            AND MD.Datum <ModuleData.Datum  
        HAVING  
            (
                SELECT count(P.ID) 
                FROM 
                    Module AS P 
                    INNER JOIN 
                    ModuleData AS PD 
                        ON P.ID = PD.Module_ID  
                WHERE Module.ID= P.ID 
            ) >1 
    ) AS DagNummer
FROM 
    (
        LeerActiviteit 
        INNER JOIN 
        (
            [Module] 
            LEFT JOIN 
            Cluster 
                ON Module.Onderdeel_Van_Cluster_ID = Cluster.ID
        ) 
            ON LeerActiviteit.ID = Module.LeerAct_ID
    ) 
    INNER JOIN 
    ModuleData 
        ON Module.ID = ModuleData.Module_ID
WHERE (((ModuleData.Datum)>Now()));

复杂查询在访问中工作,但在 C# 中调试时我得到:

System.Data.OleDb.OleDbException (0x80004005):IErrorInfo.GetDescription 失败 与 E_FAIL(0x80004005)。

adapter.Fill(dt); 中断

有什么建议吗?

谢谢,

阿诺德

【问题讨论】:

    标签: c# ms-access dataadapter


    【解决方案1】:

    这是你的问题:

    cmd.CommandType = CommandType.StoredProcedure;

    Access 中没有这样的东西。如果您按原样阅读查询,请将其设为 .Table。如果您正在编写一个 select 语句,请将其设为 .Text。

    【讨论】:

    • 实际上,Access 确实支持相当简单的stored procedures,虽然我自己从来没有机会使用过。
    • 梅雷迪思,感谢您的快速回复。不幸的是 CommandType.Text 或 .TableDirect 在复杂查询中给出了相同的错误。简单查询确实适用于 commandtype.storedprocedure。
    • 谢谢 Gord,我在这里混淆了存储过程和查询吗?我想我可以使用 commandtype.storedprocedure 运行选择查询。天真?那么,仍然不明白为什么简单的查询有效。
    • 已解决(有点):我从查询中删除了复杂的子查询(....AS DAGNUMMER),现在它可以工作了。看起来 Access 不喜欢被告知执行子查询,或者 C# 不知道如何处理结果.....打败我。
    猜你喜欢
    • 2014-04-25
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多