2012-06-29 28 views
5

Tôi có một quy trình được lưu trữ để thêm người dùng và mỗi quyền tôi thêm, tôi muốn bắt đầu tạo thông báo thành công.Trả lại thư từ một thủ tục lưu trữ đến ứng dụng C#

Quy trình lưu trữ của tôi chạy tốt nhưng làm cách nào để nhận được thông báo thành công đó trở lại hộp thoại tin nhắn trong ứng dụng của tôi?

Tôi muốn hiển thị bên dưới @text trong hộp thư trong ứng dụng C# của tôi.

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

Đây là cuộc gọi của tôi trong ứng dụng C# của tôi:

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; 
     }  
    } 

proc lưu trữ của tôi, Chỉ cần tập trung vào phần bởi tất cả các bản in, đó là văn bản tôi nói thêm:

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

Hãy thử 'MessageBox.Show (dt.Rows [0] [0] ToString()); ' – adatapost

Trả lời

7

Đặt cược tốt nhất của bạn là sử dụng thông số đầu ra.

Trong thủ tục đã lưu, hãy thêm tham số @text nvarchar(1000) OUTPUT thì trong mã của bạn, hãy thêm thông số bổ sung có tên @text và đặt hướng tham số là output.

sau đó chỉ cần thêm dòng SET @text = 'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.' trong thủ tục lưu trữ của bạn

Edit: câu trả lời của tôi là nếu bạn không muốn điều này ảnh hưởng đến truy vấn hiện tại của bạn, nếu tôi hiểu sai câu hỏi của bạn xin vui lòng cho tôi biết. Ngoài ra để có được những giá trị, sau khi bạn thực hiện truy vấn, bạn có thể nhận được giá trị từ tham số @name sử dụng .Value

Chỉnh sửa 2: Ví dụ Mã nên giống như thế

//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 

nếu bạn cần giúp đỡ các thủ tục được lưu trữ xin vui lòng gửi nó và tôi sẽ đưa ra một ví dụ với rằng quá

Chỉnh sửa 3: Ví dụ nhanh Thử nghiệm với một ví dụ nhanh chóng.Mã 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(); 
      } 
     } 

các Stored Procedure:

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 

Làm việc tốt cho tôi nếu bạn muốn kiểm tra xem nó chống lại bạn cho sự khác biệt

Sửa 4: Trong thủ tục lưu trữ của bạn @text cần phải là thông số thay vì

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

DECLARE @text NVARCHAR(1000)OUTPUT 

làm nó

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

cũng khi tạo SqlParameter sử dụng

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

mà nên thoát khỏi vấn đề kích thước như bạn đang nói với nó rằng các tham số là NVARCHAR(1000)

dòng

PRINT @text 
Select @text 

không cần thiết

+0

Làm thế nào tôi muốn nói thêm rằng tham số hướng đến đầu ra? Tôi đã thêm @text nvarchar (1000) OUTPUT, bây giờ làm thế nào để tôi nhận được hộp thư của tôi để hiển thị nó? – Pomster

+0

@Pommy không thể nhớ nếu nó được thực hiện khác nhau với SqlAdapters nhưng tôi nghĩ rằng mã đăng nên hoạt động, xin vui lòng cho tôi biết nếu nó không – Manatherin

+0

Tôi nhận được thông báo này, tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng. – Pomster

0

Bảng dữ liệu dt của bạn có đầu ra văn bản. bạn có thể Ví dụ:

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

Nếu bạn đang sử dụng MVC thì có một mẫu tuyệt vời here. Tôi đã sử dụng nó trong nhiều dự án và thấy nó tuyệt vời.

Ngoài ra, bạn nên thực sự bao gồm đối tượng SqlCommandSqlConnection trong việc sử dụng câu lệnh để ngừng kết nối bị rò rỉ.

Lưu ý: điều này có thể được điều chỉnh cho WebForms mà không gặp quá nhiều rắc rối.

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

hoặc

Sử dụng một tham số đầu ra

2

Các thông điệp có thể được lấy từ SqlConnection.InfoMessage sự kiện. Chúng có thể được nâng lên trong mã T-SQL sử dụng RAISERROR với mức độ nghiêm trọng 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;  
     } 
    } 

Và trong T-SQL:

RAISERROR(N'This is line %d', 0,0,1); 
RAISERROR(N'This is line %d', 0,0,2); 
Các vấn đề liên quan