2012-06-29 9 views
5

Mam procedurę składowaną, która dodaje użytkownika i na każde pozwolenie, które dodaję, chcę rozpocząć tworzenie wiadomości powodzenia.Powróć do wiadomości z procedury składowanej do aplikacji C#

Moja procedura przechowywana działa dobrze, ale jak mogę przywrócić komunikat o powodzeniu do okna dialogowego wiadomości w mojej aplikacji?

Chcę wyświetlić poniższy tekst @ w skrzynce z wiadomościami w mojej aplikacji C#.

DECLARE @text NVARCHAR(1000) 
SET @text = 'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.' 
SELECT @text 

To jest moja rozmowa w mojej aplikacji C#:

public DataTable CreateOrDropUser(string dataBase, string procedure, SqlParameter[] parameters) 
    { 
     try 
     { 
      if (dataBase.Length > 0) { procedure = dataBase + ".." + procedure; } //Set procedure to DBNAME..ProcedureName 

      SqlCommand cmd1 = new SqlCommand(procedure, con); 
      cmd1.CommandType = CommandType.StoredProcedure; 

      foreach (SqlParameter p in parameters) 
      { 
       if (p != null) 
       { 
        cmd1.Parameters.Add(p); 
       } 
      } 

      con.Open(); 
      DataTable dt = new DataTable(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd1); 
      da.Fill(dt); 
      con.Close(); 

      MessageBox.Show("Success"); //This should display the @text variable in my proc 

      return dt;  
    } 
    catch (Exception ex) 
    { 
     try 
     { 
      if (con.State == ConnectionState.Open) 
      { 
       con.Close(); 
      } 
     } 
     catch 
     { 
      MessageBox.Show("Could not connect to database. Check settings. " + ex.Message, "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

     MessageBox.Show(ex.Message); 
     return null; 
     }  
    } 

Moje przechowywanej proc, po prostu skupić się na odcinkach o wszystkich odbitek, to tekst Dodaję:

ALTER PROCEDURE [dbo].[AdminDevUserCreate] 
    @SQLLoginName varchar(50), 
    @SQLLoginPass varchar(50) 
AS 


DECLARE @text NVARCHAR(1000)OUTPUT 

--PRINT 'Create SQL Login' 
SET @text = 'Create SQL Login ' + @SQLLoginName 
-- USE [Master] 

EXEC(' USE [master] CREATE LOGIN [' + @SQLLoginName + '] WITH PASSWORD=''' + @SQLLoginPass + ''', DEFAULT_DATABASE=[TestAudit], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF') 

--PRINT 'Add Server Roles' 
SET @text += + CHAR(13)+CHAR(10) + 'Add Server Roles' 
--Add Server roles 
    EXEC master..sp_addsrvrolemember @loginame = @SQLLoginName, @rolename = N'bulkadmin' 
    EXEC master..sp_addsrvrolemember @loginame = @SQLLoginName, @rolename = N'processadmin' 
    EXEC master..sp_addsrvrolemember @loginame = @SQLLoginName, @rolename = N'securityadmin' 
--PRINT 'Allow SQL Agent Job Manage' 
SET @text += + CHAR(13)+CHAR(10) + 'Allow SQL Agent Job Manage' 
--USE [MSDB] 
EXEC ('msdb..sp_addrolemember ''SQLAgentOperatorRole'', ''' + @SQLLoginName + '''') 

--PRINT 'Allow Trace' 
SET @text += + CHAR(13)+CHAR(10) + 'Allow Trace' 
--Allow trace (SQL Profiler) 
--USE [MASTER] 
EXEC (' USE [MASTER] GRANT ALTER TRACE TO ' + @SQLLoginName) 

--PRINT 'Prevent admin proc changes ' 
SET @text += + CHAR(13)+CHAR(10) + 'Prevent admin proc changes ' 
    EXEC ('USE [TestAudit] DENY ALTER ON [TestAudit].[dbo].[Admin] TO ' + @SQLLoginName) --Prevents changes to Admin function 
--PRINT 'Prevent database trigger changes' 
SET @text += + CHAR(13)+CHAR(10) + 'Prevent database trigger changes' 
    EXEC ('USE [TestAudit] DENY ALTER ANY DATABASE DDL TRIGGER TO ' + @SQLLoginName) --Prevents modify of [SchemaAuditTrigger] 

PRINT @text 
Select @text 
+0

Try 'MessageBox.Show (dt.Rows [0] [0] .ToString());' – adatapost

Odpowiedz

7

Najprościej jest użyć parametru wyjściowego.

W swojej procedury przechowywanej dodać parametr @text nvarchar(1000) OUTPUT następnie w kodzie dodać dodatkowy parametr o nazwie @text i ustawić kierunek parametru do output.

potem po prostu dodać linię SET @text = 'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.' w procedurze przechowywanej

Edycja: Moja odpowiedź brzmi: jeśli nie chcesz to mieć wpływ na bieżące zapytania, jeśli błędnie interpretowane pytanie proszę dać mi znać. Również uzyskać wartość, po wykonaniu zapytania można uzyskać wartość z parametru @name użyciu .Value

Edit 2: Przykładowy kod powinien wyglądać podobnie

//Add these lines 
SqlParameter text = new SqlParameter("@name", SqlDbType.NVarChar); 
text.Direction = ParameterDirection.Output; 
cmd1.Parameters.Add(text); 

con.Open(); 
DataTable dt = new DataTable(); 
SqlDataAdapter da = new SqlDataAdapter(cmd1); 
da.Fill(dt); 
con.Close(); 

//Change this line 
MessageBox.Show(text.Value); //This should display the @text variable in my proc 

jeśli potrzebujesz pomocy procedura składowana proszę zamieścić, a ja podam przykład z tym również

Edytuj 3: Szybki przykład Przetestowano za pomocą szybkiego przykładu.Kod C#:

 using (SqlConnection connection = new SqlConnection(@"Data Source=.\SQLExpress;Initial Catalog=TestDB;Integrated Security=True")) 
     { 
      connection.Open(); 
      using (SqlCommand command = connection.CreateCommand()) 
      { 
       command.CommandType = CommandType.StoredProcedure; 
       command.CommandText = "Test"; 

       SqlParameter text = new SqlParameter("@Text", SqlDbType.NVarChar, 1000); 
       text.Direction = ParameterDirection.Output; 
       command.Parameters.Add(text); 

       using (DataTable dt = new DataTable()) 
       { 
        using (SqlDataAdapter da = new SqlDataAdapter(command)) 
        { 
         da.Fill(dt); 
        } 
       } 

       Trace.WriteLine(text.Value); 

       connection.Close(); 
      } 
     } 

procedura przechowywana:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE Test 
    @Text Nvarchar(1000) OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @Text = 'test' 
END 
GO 

działało w porządku dla mnie, jeśli chcesz sprawdzić je przed twoim różnic

Edycja 4: W swojej procedury przechowywane @tekst musi być parametrem, więc zamiast

Make It

ALTER PROCEDURE [dbo].[AdminDevUserCreate] 
    @SQLLoginName varchar(50), 
    @SQLLoginPass varchar(50), 
    @text NVARCHAR(1000) OUTPUT 
AS 

również podczas tworzenia SqlParameter używać

SqlParameter text = new SqlParameter("@Text", SqlDbType.NVarChar, 1000); 

który powinien pozbyć się kwestii wielkości jak mówisz to, że parametr jest NVARCHAR(1000)

linia

PRINT @text 
Select @text 

nie powinno być potrzebne

+0

Jak Dodam, że parametr skierowany do wydajność? Dodałem @text nvarchar (1000) OUTPUT, teraz jak mogę dostać mój messagebox, aby go wyświetlić? – Pomster

+0

@Pommy nie może zapamiętać, czy jest to zrobione inaczej z SqlAdapters, ale myślę, że napisany kod powinien działać, proszę dać mi znać, jeśli to nie – Manatherin

+0

Mam tę wiadomość, odniesienie do obiektu nie jest ustawione na wystąpienie obiektu. – Pomster

0

Twoja tabela danych dt zawiera wyniki tekstowe. można Np

MessageBox.Show("" + dt.Rows[0][0]); 
2

Jeśli korzystasz z MVC, to istnieje doskonała próbka here. Użyłem go w wielu projektach i uznałem to za fantastyczne.

Również powinieneś naprawdę owinąć swój obiekt SqlCommand i SqlConnection za pomocą instrukcji, aby zatrzymać nieszczelne połączenia.

Uwaga: można to dostosować do WebForms bez większych problemów.

1
MessageBox.Show(dt.Rows[0][0].Tostring()); 

lub

Użyj parametr wyjściowy

2

Komunikaty informacyjne mogą być pobierane z SqlConnection.InfoMessage imprezy. Można je wywoływać w kodzie T-SQL za pomocą RAISERROR o powadze 0-9.

public DataTable CreateOrDropUser(string dataBase, string procedure, SqlParameter[] parameters) 
    { 
     SqlconnecitonStringBuilder scsb = new SqlConnectionStringBuilder (connstring); 
     scsb.Database = database; 
     using (SqlConnection con = new SqlConnection (scsb.ConnectionString)) 
     { 
      StringBuilder sb = new StringBuilder(); 
      con.Open(); 

      SqlCommand cmd1 = new SqlCommand(procedure, con); 
      cmd1.CommandType = CommandType.StoredProcedure; 
      foreach (SqlParameter p in parameters) 
      { 
       if (p != null) 
       { 
        cmd1.Parameters.Add(p); 
       } 
      } 

      conn.InfoMessage += (args => 
      { 
       sb.AppendLine (args.Message); 
      }); 
      DataTable dt = new DataTable(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd1); 
      da.Fill(dt); 
      MessageBox.Show(sb); 
      return dt;  
     } 
    } 

I w T-SQL:

RAISERROR(N'This is line %d', 0,0,1); 
RAISERROR(N'This is line %d', 0,0,2); 
Powiązane problemy