Laden...

Forenbeiträge von Nesso Ingesamt 18 Beiträge

05.08.2020 - 11:52 Uhr

Hallo Leute,

vielen Dank, die MSDN Artikeln waren für mich sehr hilfreich! 👍 👍

04.08.2020 - 19:04 Uhr

Hallo Liebe myC# Freunde,

folgendens plagt mich beim aufrufen einer DLL übern einen Dienst...

Szenario: Über einen Dienst wird eine DLL eingebunden (ist auch registriert) auf einem Windows Server (2012) (Testumgebung).
Diese DLL ruft eine beliebige Anwendung auf, als Beispiel nehmen wir Notepad.exe, die ich mit System.Diagnostic.Process.Start aufrufe

Wird die DLL über den Dienst ausgeführt, sehe ich Notepad nur als Hintergrundprozess. Erwartet hätte ich, das der Editor aufgeht.

Packe in den gleichen Code in einer Konsolenanwendung zum testen und starte die EXE, funktioniert das einwandfrei.

Daraufhin kam mir die Idee, dass ich eventuell Parametern von System.Diagnostics.ProcessStartInfo übergeben muss.
Habe das im unterem Code ausgeführt, an welche ich mich bedient habe aus meinen Recherchen.

Leider bekam ich nicht den gewünschten Effekt zurück und ich sehe Notepad nur im Hintergrundprozess.
Vll kann mir jemand diesen Verhalten erklären, da ich gerade nicht schlau davon werde.
Kann es sein, das ich irgendwelche Parameter vergessen habe?

Hier mein Code:


var ssPwd = new SecureString();
                string password = "meinPW!";
                for (int x = 0; x < password.Length; x++)
                {
                    ssPwd.AppendChar(password[x]);
                }
                using (Process process1 = new Process())
                {
                    process1.StartInfo = new ProcessStartInfo(@"C:\Windows\system32\notepad.exe");
                    process1.StartInfo.CreateNoWindow = true;
                    process1.StartInfo.ErrorDialog = false;
                    process1.StartInfo.RedirectStandardError = true;
                    process1.StartInfo.RedirectStandardInput = true;
                    process1.StartInfo.RedirectStandardOutput = true;
                    process1.StartInfo.UseShellExecute = false;
                    process1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    process1.StartInfo.UserName = Environment.UserName;
                    process1.StartInfo.Password = ssPwd;
                    process1.StartInfo.Domain = Environment.UserDomainName;
                    process1.Start();
                    process1.WaitForExit();
                }


Ich hoffe, das Forum ist richtig gewählt und ich habe die Forumssuche richtig bedient X(
Liebe Grüße

20.11.2012 - 16:49 Uhr

Hast Du den SQLServer-Oberflächenkonfigurator eingeschaltet?


		Select * FROM sys.configurations WHERE name LIKE 'CLR%'

Falls nicht, so kann man es aktivieren:


		EXEC sp_configure 'show advanced options', 1
		GO
		RECONFIGURE
		GO
		sp_configure 'clr enabled', 1
		GO
		RECONFIGURE

Was mir spontan noch einfällt...
...prüfe mal nach ob er mit dem .Net Framework ein problem hat.
Im SQL Server 2008 wollte ermaximal 3.5 haben...?
...eventuell den Kompatibilitätsgrad anpassen
...die

WITH PERMISSION_SET

auf SAFE setzen?

LG Nesso

19.11.2012 - 15:30 Uhr

verwendetes Datenbanksystem: <.mdb>
Entwicklungsumgebung: VS2010

Hallo Liebe Community,

ich habe ein einfaches Vorhaben, was mir momentan den Kopf zerbricht.

Ich habe zwei Comboboxen.
Die Auswahl der ersten Combobox soll die Einträge in der zweiten Combobox filtern.
Eigentlich ganz einfach...

Meine vorgehensweise:

Ich verwende ein typisiertes DataSet.
Das DataSet hat momentan zwei Tabellen mit einer 1 zu N Beziehung:

Tabelle tbl_Verband:
ID_Verband (Autowert)
Verband (Text)

Tabelle tbl_Verein:
ID_Verein (Autowert)
Verein (Text)
FK_Verband (Zahl)

Im Designer erstelle ich mir zwei Comboboxen.

CB_Verband bekommt über den Designer folgendes zugewiesen:
DataSource = DataSet1.tbl_Verband
SelectedValue = FK_Verband (Databinding aus der tbl_Verein)
ValueMember = ID_Verband
DisplayMember = Verband

CB_Verein:
DataSource = DataSet1.tbl_Verein
ValueMember = ID_Verein
DisplayMember = Verein

Nachdem ich das so eingegeben habe, findet man in dem Load Event folgenden Code:


this.verbandTableAdapter.Fill(this.DataSet1.tbl_Verband);
this.vereinTableAdapter.Fill(this.DataSe1t.tbl_Verein);

Starte ich die Anwendung,bekomme ich leider alle Inhalten in die CB geschrieben.
Es wird nicht gefiltert...aber wenn ich in der CB_Verein ein Verein auswähle springt die CB_Verband zu den dazugehörigen Verband...
Eigentlich nicht das, was ich haben wollte.

Ich habe mir bereits folgende Links schon angeschaut:
Problem mit Relation
ComboBox-Bindung: Nach Auswahl in der ersten Box in zweiter Box die zugehörigen Werte anzeigen

Ich hoffe, Ihr versteht mein Problem und könnt mir weiterhelfen.

LG
Nesso

24.09.2011 - 19:16 Uhr

Hallo,

nein ihr habt schon recht, im erklären bin ich wohl eine Null.
Und bin wegen der Kritik auch niemanden böse.
Ich sehen ja, dass man mir hier helfen möchte.

Ich werde mich am Montag wieder mit der Problematik auseinandersetzen und es strukturierter angehen.

Trotzdem Danke, Erklärungsversuch 3 folgt eventuell... 😄

LG Nesso

23.09.2011 - 22:10 Uhr

Hallo Chilic,

ja etwas schwamig formuliert von mir, da ich schon eine Weile dran bin und das ganze für mih total verständlich ist^^.

Ich erkläre es gerne nochmal:

Für jede Datenbank gibt es zwei Listboxen und einen Button für die Verbindung zur Datenbank.

Die erste Lisbox zeigt die Tabellen. die sich in der Datenbank befinden.
Die zweite Listbox zeigt, wenn man auf der ersten Listbox eine Tabelle anklickt, die Spalten derer an.

So, jetzt habe ich die zweite Datenbankverbindung, die genau wie oben beschrieben ist funktioniert. Auch mit zwei Listboxen etc.

Beide Connection laufen (sollten) parallel zu jeweils zwei verschiedenen Datenbanken. Sie werden aber nicht gleichzeitig gestartet, sondern nacheinander also wenn ich auf den Button "Connect(1)" und/oder "Connect(2)" drücke.

Das Problem ist dann:

  • Erste Verbindung zur Datenbank funktioniert fehlerfrei.
  • zweite Verbindung zur Datenbank auch, Tabelle und Spalten lassen sich wunderbar auswählen so wie bei der Ersten.
  • wechsel ich jetzt zu der Listbox mit der ersten Verbindung, ist die Listbox noch gefüllt mit den Tabellen (vom Resultset), aber sobald ich etwas anklicke, zeigt es mir in der zweiten Listbox die Spalten nicht mehr an, ergo es besteht keine Verbindung mehr zu der ersten Datenbank.

Daher die Vermutung mit dem Handler, dass er mir von der ersten Verbindung verloren geht, wenn ich die zweite Verbindung aufbauen möchte...

Deshalb dachte ich an etwas wie, ich übergebe jeden Connect-Button den Handler des jeweiligen, so bleibt meine Verbindung immer bestehen...
Oder eben ich löse für jede Verbindung einen Thread aus, was ich hoffentlich vermeiden kann...

Da liegt eben mein Problem, wie ich das am besten lösen kann, so dass die erste Verbindung aufrecht bleibt, wenn ich die zweite Verbindung aufbaue.

hoffe ich habe mich besser ausgedrückt, sorry nachmal!

LG Nesso

23.09.2011 - 15:50 Uhr

Hallo Community,

folgende Situation habe ich:

Eine Windowsforms Anwendung, die zwei Datenbankconnections auf unterschiedliche Datenbanken verbindet.
Ich lasse mir dann die Tabellen und Spalten ausgeben.

Allerdings ist es so, wenn ich den Ersten Connect starte und danach eine Tabelle in der Listbox anklicke um mir die Spalten anzuzeigen funktioniert das solange, bis ich den Zweite Connect auslöse (zweiter Eventhändler, Button_Connect2).
D.h. wenn ich in die Listbox des ersten Connect wieder anklicke, zeigt er mir die Spalten einer Tabelle nicht mehr an, weil er keine Connection zur Datenbank mehr hat, bzw. geht der Eventhandler verloren?! (so vermute ich...)

Frage: Nach dem ich mich hier [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) eingelesen habe, frage ich mich ob es Sinn mach einen Thread zu programmieren, oder ob es eine andere Möglichkeit gibt.

Ich dachte an sowas wie, den Eventhandler1 in Eventhandler2 zu übergeben oder so was ähnliches...allerdings weiß ich nicht, ob so eine Methedo "schick" und perfomant ist...und ob das so einfach geht wie ich es mir vorstelle...

Ich würde mich über eure Erfahrungswerte sehr freuen!

Liebe Grüße

Nesso

19.09.2011 - 19:56 Uhr

Nun ja,

meine Testdatenbank ist vom Kunde, die ich zum spielen bekommen habe^^
(auch wenn es ein alter Stand ist...)

Und sie zu verändern, für diesen Beispiel ist schwer, weil es doch sehr komplex ist und man auch verstehen muss, was das ganze eigentlich soll und warum die Struktur und so weiter.

Aber Ihr habt mir schon sehr viel geholfen, dafür danke!

Grüße,
Nesso

19.09.2011 - 17:18 Uhr

Hallo Florian,

vielen Dank für dein Beispiel! Find ich klassen wenn man mehrer/bessere Wege gezeigt bekommt.

Die ID_CR kommt in meinen Beispiel in 18 Tabellen vor, habe die DB so bekommen...

Mit dieser ID wird dann die "UserID" ermittellt, an hand dessen kann man in einer Appliaktion genau sagen, wer gerade wo eine Änderung vorgenommen hat.

Allerdingst musste ich auf das "sp_exceutesql" verzichten, weil ich es auf einer View weiter verwenden musste...

Grüße,
Nesso

19.09.2011 - 15:13 Uhr

Hallo,

nein, der Code ist nicht im Einsatz und danke für den Hinweis.

Ich dachte, es ist ein gutes Beispiel für eine CLR um, ein dynamischen SQL Statement zu erzeugen.
Weil ein Datenbankprofie meinte mal zu mir, mann kann keine Variable in einer FROM-Klausel einfügen/ ausführen etc...?

Da ich ziemlich frisch auf dem Gebiet bin, ist mir über T-SQL keine Lösung eingefallen. Mich würde es aber interessieren wie Deine Lösung aussehen könnte.

Na klar, gehört jetzt nicht hier rein aber würde mich über eine Antwort oder PN von Dir freuen.

Grüße,
Nesso

06.09.2011 - 18:06 Uhr

Hallo Leute,

habe das Problem gelöst.

Der Fehler lag hier:


[Microsoft.SqlServer.Server.SqlFunction]

Ersetzt man dies durch:


[SqlFunction(DataAccess = DataAccessKind.Read)]

Funktioniert das ganze ganz gut 😃

hier noch ein Link zum Thema CLR Skalarfunktionen

Für die Nachwelt, hier der gesamte Code:


using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [SqlFunction(DataAccess = DataAccessKind.Read)]
    public static int F_Seac(Int32 p_ID_CR, String p_Tab)
    {
        using (SqlConnection conn = new SqlConnection("context connection=true"))
        {

            String SQLString;
            SqlCommand cmd;
            
            SQLString = "SELECT MIN(Eintrag_ID_User) AS ID_User " +
                                " FROM " + p_Tab +
                                " WHERE (ID_CR = " + p_ID_CR + ") AND (Bin_AktuellerDS = 1)";

            conn.Open();
            cmd = new SqlCommand(SQLString, conn);
            cmd.ExecuteScalar();

            return (int)cmd.ExecuteScalar();
 
        }     
    }
};


Für mich kann das Thema geschlossen werden,
danke an Alle, für die Tipps und Anregungen.

Grüße,
Nesso

05.09.2011 - 14:36 Uhr

@FZelle,

danke für den Hinweis!
Habe nun weiter recherchiert und bin auch an so Sachen gestoßen wie "Strong Name" etc.

Hast du mir vielleicht ein Beispiel oder eine Erklärung etc. wie ich das zu bewerkstelligen habe?

Grüße
Nesso

05.09.2011 - 11:44 Uhr

Hallo Flo,

danke für den Tipp und Hinweis.

Ich habe jetzt meine Connection nun so geändert:


DBConn = new System.Data.SqlClient.SqlConnection("Context Connection=true");
        DBConn.Open();
        cmd = new System.Data.SqlClient.SqlCommand(SqlString, DBConn);

        DataReader = cmd.ExecuteReader();

        while (DataReader.Read())
            Ergebnis = DataReader["ID_User"].ToString();

        DataReader.Close();
        DBConn.Close();

        return new SqlString(Ergebnis);
    }

Habe ich das so richtig verstanden?
Weil der Fehler bestehen bleibt, da her die Frage.

Sorry muss blöd fragen, weil ich sowas zum erstenmal mache...

Grüße
Nesso

05.09.2011 - 10:45 Uhr

verwendetes Datenbanksystem: <SQL SERVER 2008 R2>

Hallo liebe Community!

Ich erstelle in C# ein Assembly für den SQL Server 2008 R2.
Nun möchte ich aber, dass meine Assembly auf die Datenbank zugreift und eine Abfrage ausführt.
Das Ergenis soll dann in meiner SQL Funktion ausgegeben werden.

Was habe ich bisher getan:
Um die Assembly einzubinden, habe ich Anhand meines Skripts die SQL Server-Oberflächenkonfiguration eingeschaltet und zwar so:


EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'clr enable', 1
GO
RECONFIGURE
GO

Dies hat auch funktioniert.

Dann habe ich mit VS 2010 ein "SQL CLR-Datenbankprojekt" erstellt.
Am Anfang wird man nach der DB Connection gefragt (da kann man nichts falsch eingeben...)

Hier mein Code:


using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;


public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString SearchID_User(int ID_CR, String Tab)
    {
        //Berechtigung in der benutzerdefinierten Assembly Assert
        System.Data.SqlClient.SqlClientPermission pSql = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
        pSql.Add("Data Source={SQL Server};Server=./;Database=CIM_RIMIS;Integrated Security=True", "", KeyRestrictionBehavior.AllowOnly);
        pSql.Assert();


        String SqlString;
        String Ergebnis = "Hallo";
        SqlConnection DBConn;
        SqlCommand cmd;
        SqlDataReader DataReader;

        SqlString = "SELECT MIN(Eintrag_ID_User) AS ID_User " +
                            " FROM " + Tab +
                            " WHERE (ID_CR = " + ID_CR + ") AND (Bin_AktuellerDS = 1)";


        DBConn = new System.Data.SqlClient.SqlConnection("Data Source={SQL Server};Server=./;Database=CIM_RIMIS;Integrated Security=SSPI;");
        DBConn.Open();
        cmd = new System.Data.SqlClient.SqlCommand(SqlString, DBConn);
        DataReader = cmd.ExecuteReader();

        while (DataReader.Read())
            Ergebnis = DataReader["ID_User"].ToString();

        DataReader.Close();
        DBConn.Close();

        return new SqlString(Ergebnis);
    }
};

Der Code wird dann unter Erstellen/"Projekt" bereitstellen als Assembly für den SQL Server bereitgestellt.
Dies kann man mit dem Skript


Select * from sys.assemblies

überprüfen.

Nach dem alles bereitgestellt wurde und ich meine Funktion (Skript) ausführen möchte kommt dann der tolle Fehler:> Fehlermeldung:

Meldung 6522, Ebene 16, Status 2, Zeile 11
.NET Framework-Fehler beim Ausführen der benutzerdefinierten Routine oder des benutzerdefinierten Aggregats 'SearchID_User':
System.Security.SecurityException: Fehler bei der Anforderung des Berechtigungstyps "System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
System.Security.SecurityException:
bei System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 unrestrictedOverride, Int32 create)
bei System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
bei System.Security.CodeAccessPermission.Assert()
bei UserDefinedFunctions.SearchID_User(Int32 ID_CR, String Tab)

hier mein SQL Skript:


USE [CIM_RIMIS]
GO
/****** Object:  UserDefinedFunction [dbo].[SearchID_User]    Script Date: 08/31/2011 09:19:15 ******/
ALTER FUNCTION [dbo].[SearchID_User](@ID_CR [int], @Tab [nvarchar](4000))
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [SQLDB_CLR_CIM_RIMIS].[UserDefinedFunctions].[SearchID_User]

begin

declare @m_ID_CR [int]
declare @m_Tab [nvarchar](4000)
declare @m_Count [int]
declare @m_ID_User [nvarchar](4000)

set @m_ID_CR =  (Select Top 1 [ID_CR] From [CIM_RIMIS].[dbo].[V_ID_CR_Letzte_Aenderung_3]) --Test für Daten
set @m_Tab = (Select Top 1 [Tab] FROM [CIM_RIMIS].[dbo].[V_ID_CR_Letzte_Aenderung_3]) --Test für Daten

Select [dbo].[SearchID_User](@m_ID_CR, @m_Tab) as ID_User

end

Frage: Kann man mit CLR überhaupt eine Abfrage auf die Datenbank machen, so wie ich es mir oben vorgestellt habe?
Ist es überhaupt richtig was ich da mache, oder funktioniert das ganz anderst mit der Abfrage?
Ich würde mich über eure Hilfe, Tipps und Anregungen freuen.

Vielen Dank schon mal!

Gruß
Nesso

21.08.2010 - 14:05 Uhr

Thema kann als erledigt abgestempelt werden, danke nochmals an alle 😃

20.08.2010 - 14:59 Uhr

o.O schade...

dann führt wohl kein weg dran vorbei X(

Trotzdem Danke für die Info 🙂

LG

20.08.2010 - 13:49 Uhr

Ähm nein, also...

einfach eine ListView befüllen von einer Accessdatenbank aus, wo unter anderen auch diese Ja/Nein Box vorhanden ist.

Allerdings hab ich bei

temp.SubItems.Add(dr....

keine Möglichkeit gefunden mir diese Ja/Nein Box auszugeben, so wie zum Beispiel ein Int

ListViewItem temp = new ListViewItem(dr.GetInt32(0).ToString()); 

.

Hoffe die Erklärung ist besser >.<

20.08.2010 - 13:27 Uhr

Hallo,

habe eine einfache Frage die mir Kopfschmerzen bereitet...
und zwar würde ich in einer ListView diese Checkbox von Access anzeigen lassen.

Ist das überhaupt möglich?
Will kein GridView verwenden weil ich schon alles mit ListViews erstellt habe...

Code Beispiel:


//Spalten für ListView werden angelegt
        private void ListViewHeader(ListView p_List) 
       {
           p_List.Items.Clear();
           
           p_List.Columns.Clear();
           p_List.Columns.Add("Pos");
           p_List.Columns.Add("Anfang");
           p_List.Columns.Add("Ende");
           p_List.Columns.Add("Pause");
           p_List.Columns.Add("ABZeit");
           p_List.Columns.Add("Checkbox");
              
       }

DataReader

 private void DataReader()
       {
           String SQLEintraege = "SELECT....

           OleDbConnection Connection = new OleDbConnection(Properties.Settings.Default.ConString);
           OleDbCommand cmd = new OleDbCommand(SQLEintraege, Connection);
           Connection.Open();
           OleDbDataReader dr;
           dr = cmd.ExecuteReader();
           

           while (dr.Read())
           {
               ListViewItem temp = new ListViewItem(dr.GetInt32(0).ToString()); // Stunden ID
               temp.SubItems.Add(dr.GetDateTime(1).ToShortTimeString()); // Anfang
               temp.SubItems.Add(dr.GetDateTime(2).ToShortTimeString()); // Ende
               temp.SubItems.Add(dr.GetDateTime(3).ToShortTimeString()); // Pause
               temp.SubItems.Add(dr.GetDateTime(4).ToShortTimeString()); // Arbeitszeit
               // temp.SubItems.Add(hier sollte die Checkbox stehen...

               
               
               this.LVEintraege.Items.Add(temp);
           }

           dr.Close();
           Connection.Close();

       }

Ich hoffe ihr versteht mein Problem.