Hallo Leute,
vielen Dank, die MSDN Artikeln waren für mich sehr hilfreich! 👍 👍
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
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
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
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
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:
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
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
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
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
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
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
@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
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
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
Thema kann als erledigt abgestempelt werden, danke nochmals an alle 😃
o.O schade...
dann führt wohl kein weg dran vorbei X(
Trotzdem Danke für die Info 🙂
LG
Ä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 >.<
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.