Как читать данные из базы данных SAP через SQL в C# - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть задача преобразовать sh очень старый макрос VBA в программу. NET. Этот макрос собирает данные из нашей базы данных SAP. К сожалению, я ничего не знаю о SAP и о том, как справиться с этим из моей программы C#. Для этой программы я использую. NET 4.7.2. Это старый код:

Option Private Module
Global db_005SAPTABLES As DAO.Database

Public Sub ECadSQL_Abfrage(ByVal lngZeile As Long)

Dim rsETV As DAO.Recordset
Dim MatNr As String
Dim strSQL As String

'MatNr einlesen
MatNr = Range("E" & lngZeile).Value

If MatNr = "" Then
    Range("F" & lngZeile).Value = ""
    Range("G" & lngZeile).Value = ""
    Range("H" & lngZeile).Value = ""
    Range("I" & lngZeile).Value = ""
    Range("J" & lngZeile).Value = ""
    Range("K" & lngZeile).Value = ""
GoTo weiter1
End If

'SQL abfrage
strSQL = "select * FROM T_ECAD_SAP_Daten where ArticleNumber = '" & MatNr & "'"

'Verbinden mit Datenbank
Connect_005SAPTABLES

Set rsETV = db_005SAPTABLES.OpenRecordset(strSQL)

'Daten auslesen
    Range("F" & lngZeile).Value = rsETV.Fields("PP_Status").Value
    Range("G" & lngZeile).Value = rsETV.Fields("Class").Value
    Range("H" & lngZeile).Value = rsETV.Fields("Gerätetyp").Value
    Range("I" & lngZeile).Value = rsETV.Fields("Kenngroesse_1").Value
    Range("J" & lngZeile).Value = rsETV.Fields("Kenngroesse_2").Value
    Range("K" & lngZeile).Value = rsETV.Fields("Kenngroesse_3").Value

rsETV.Close

weiter1:        
End Sub




Sub Connect_005SAPTABLES()

Dim Fehlermeldung As String
Dim constr As String

On Error GoTo Connect_005SAPTABLESErrorHandler

'Verbindungsangaben zur Datenbank
constr = "DRIVER={SQL Server};SERVER=*******.patec.group;"
constr = constr & "DATABASE=005SAPTables;UID=005SAP*****;PWD=******;APP=F-Kalkulation"

'Datenbank öffnen
Set db_005SAPTABLES = OpenDatabase("005SAPTABLES", dbDriverNoPrompt, True, constr)

Exit Sub

'ErrorHandler
Connect_005SAPTABLESErrorHandler:

Fehlermeldung = "Unbehandelter Fehler in Prozedur Connect_005SAPTABLES aufgetreten " & Chr(13) & "FehlerNr. " & Err.Number & " " & Err.Description
MsgBox Fehlermeldung, vbExclamation, "Fehlermeldung"

End Sub

Возможно, есть возможность перевести этот код в C# на основе реальной технологии. Самый простой способ получить (только для чтения) данные из этой БД, будет отличным для меня. Какую библиотеку я должен внедрить в мою программу? Или какая самая простая и новейшая технология в настоящее время?

Заранее спасибо.

РЕДАКТИРОВАТЬ: ======================== =============================

command.ExecuteReader () вызывает исключение: Неверный объект name 'T_ECAD_SAP_Daten' --- Но Server Explorer показывает мне именно это имя таблицы.

Решение: я не знаю почему, но синтаксис VBA SQL сильно отличается от C# one

// from VBA
SELECT * FROM T_ECAD_SAP_Daten WHERE ArticleNumber = 'E54990198'
// at C#
SELECT * FROM [005SAPTables_DBO].[T_ECAD_SAP_Daten] WHERE ArticleNumber = '54990198'

1 Ответ

0 голосов
/ 17 апреля 2020

Я не знаю, настоящая ли это база данных SAP, или SAP использует общую базу данных MSSQL / mySQL.

Мое решение:

private static SqlConnection conn;

    public static DataTable ECadSQL_Abfrage(double number)
    {
        Connect();

        SqlCommand command = conn.CreateCommand();
        command.CommandText = "SELECT * FROM [005SAPTables_DBO].[T_ECAD_SAP_Daten] WHERE ArticleNumber = '" + number + "'";

        DataSet ds = new DataSet();
        var da = new SqlDataAdapter(command);
        //  .Fill opens and closes the connection by itself, therefore the connect() and close() functions are unnecessary
        da.Fill(ds);
        DataTable dt = ds.Tables[0];
        // string st1 = dt.Rows[0]["PP_Status"].ToString();
        // string st2 = dt.Rows[0]["Class"].ToString();

        Close();

        return dt;
    }


    public static void Connect()
    {
        string server = "******.patec.group";
        string database = "005SAPTABLES";
        string username = "********";
        string password = "*****";

        conn = new SqlConnection("Data Source=" + server + ";Initial Catalog=" + database + ";User Id=" + username + ";Password=" + password + ";");
        //conn.Open();
    }


    public static void Close()
    {
        //conn.Close();
        conn.Dispose();
    }
...