0

この奇妙な問題のヒントを探しています。

アクセス (OleDb) データベースから ac#/wpf DataTable にデータを取得しようとしています。おもしろいことに、単純なクエリがアクセスで機能し、Datatable にダウンロードされますが、問題ありません。(少し) より複雑なクエリは 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);

助言がありますか?

ありがとう、

アーノルド

4

1 に答える 1

1

問題は次のとおりです。

cmd.CommandType = CommandType.StoredProcedure;

Access ではそのようなことはありません。クエリをそのまま読み取る場合は、.Table にします。select ステートメントを作成している場合は、.Text にします。

于 2013-06-13T20:43:41.877 に答える