Announcement

Collapse
No announcement yet.

auf ado..NET com+ server zugreifen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • auf ado..NET com+ server zugreifen?

    ich habe eine große Anzahl von COM+ Applikationen/Objekten die ein ADO-Recordset über ein OLEVariant zurückgeben.

    Wie kann ich einen C# ADO.NET COM+ Objekt erstellen welches einen Recordset liefert, das ,wie gehabt, in Delphi verwendet werden kann? Hat vielleicht jemand ein Beispiel?

    Einfache Typen zu übergeben oder das Absetzen von Commands sind kein Problem.

    Ich will eine komplette neuprogrammierung einer bestehenden Delphi Applikation verhindern.

    Vielen Dank

    Knut Lambert

  • #2
    Hallo,

    >Hat vielleicht jemand ein Beispiel?

    Das folgende Beispiel für ein mit C# geschriebenes .NET Enterprise Services-Objekt (COM+) zeigt, wie ein gefülltes ADO-Recordset über den Parameter <b>ref ADODB.Recordset aRS</b> an einen beliebigen Client (.NET und Delphi) zurückgeliefert wird. Zuerst greift die Methode auf ADO.NET zurück, um dann über eine Connection-/Recordset-Instanz auf dem "alten" Weg über ADO die Daten einzulesen und zum Client zurückzuliefern:

    <pre>

    public int VERSGetNPUpdate(
    string sNP,
    string sLastDateStr,
    ref string sCurDateStr,
    ref ADODB.Recordset aRS,
    ref string sMsg)
    {
    int iReturn = 0;
    try
    {
    SqlCommand aCmd = new SqlCommand();
    aCmd.CommandText = "[spVersCheckDate]";
    aCmd.CommandType = CommandType.StoredProcedure;
    aCmd.Connection = this.aCon;
    // RETURN_VALUES
    aCmd.Parameters.Add("@RETURN_VALUE", SqlDbType.Int, 4).Direction = ParameterDirection.ReturnValue;
    // Input-Parameter
    aCmd.Parameters.Add("@npname", SqlDbType.VarChar, 20).Value = sNP;
    aCmd.Parameters.Add("@lastdatestr", SqlDbType.VarChar, 20).Value = sLastDateStr;
    // Output-Parameter
    aCmd.Parameters.Add("@currentdate", SqlDbType.DateTime, 8).Direction = ParameterDirection.Output;
    aCon.Open();
    try
    {
    aCmd.ExecuteNonQuery();
    iReturn = (int) aCmd.Parameters["@RETURN_VALUE"].Value;
    sCurDateStr = aCmd.Parameters["@currentdate"].Value.ToString();
    }
    finally
    {
    aCon.Close();
    }
    if (iReturn == 2)
    {
    // das gefüllte ADO-Recordset-Objekt muss zum Client zurückgeliefert werden
    ADODB.Connection aADOCon = new ADODB.Connection();
    aADOCon.ConnectionString = sCSADO;
    aADOCon.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
    aADOCon.Open(sCSADO, "", "", 0);
    try
    {
    aRS = new ADODB.Recordset();
    aRS.CursorLocation = ADODB.CursorLocationEnum.adUseClientBatch;
    aRS.Open("SELECT * FROM " + sNP, aADOCon,
    ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockBatchOptimistic, 0);
    aRS.ActiveConnection = null;
    iReturn = 3;
    }
    finally
    {
    aADOCon.Close();
    Marshal.ReleaseComObject(aADOCon);
    }
    }
    ContextUtil.SetComplete();
    }
    catch (SqlException aSqlExc)
    {
    ZFDMANCS.OSLogError.LogSqlException(aSqlExc);
    throw aSqlExc;
    }
    catch (Exception aExc)
    {
    sMsg = aExc.Message;
    ContextUtil.SetAbort();
    ZFDMANCS.OSLogError.WriteError(aExc.Message + Environment.NewLine + aExc.StackTrace);
    }
    return iReturn;
    }

    </pre&gt

    Comment

    Working...
    X