2013-08-04 56 views
5
private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      SqlConnection conn = new SqlConnection(); 
      conn.ConnectionString = "Data Source=*******;Initial Catalog=ChatApp;User ID=Chatapplication;Password=****"; 
      conn.Open(); 
      SqlCommand cmd = new SqlCommand(); 
      string chatroomidno = textBox1.Text; 
      string chatroomname = textBox2.Text; 
      //cmd.CommandText = "Select [email protected],[email protected] from tblChatRoom"; 
      //cmd.Connection = conn; 
      SqlDataAdapter adapt = new SqlDataAdapter("Chatroomapp",conn); 
      adapt.SelectCommand.CommandType = CommandType.StoredProcedure; 
      DataSet ds=new DataSet(); 
      DataTable dt = new DataTable(); 
      adapt.SelectCommand.Parameters.Add(new SqlParameter("@ChatRoomID", SqlDbType.VarChar, 100)); 
      adapt.SelectCommand.Parameters["@ChatRoomID"].Value = chatroomidno; 
      adapt.SelectCommand.Parameters.Add(new SqlParameter("@ChatRoomName", SqlDbType.VarChar, 50)); 
      adapt.SelectCommand.Parameters["@ChatRoomName"].Value = chatroomname; 
      adapt.Fill(ds, "tblChatRoom"); 
      if (dt.Rows.Count > 0) 
      { 
       MessageBox.Show("Connection Succedded"); 
      } 
      else 
      { 
       MessageBox.Show("Connection Fails"); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error", ex.Message); 
     } 
    } 

khi biên dịch chương trình tôi đã nhận chỉ kết nối thất bại hộp thông báo, trong cơ sở dữ liệu tôi tìm thấy đúng, làm thế nào để vượt qua những chương trình để có được kết nối succeded hộp thông báoLàm thế nào để gọi một thủ tục lưu trữ sử dụng ado.net

Trả lời

7

Vâng, bạn đang điền vào bộ dữ liệu ds - nhưng sau đó bạn đang kiểm tra bảng dữ liệu dt cho sự hiện diện của các hàng ... điều đó sẽ không bao giờ hoạt động, tất nhiên!

Nếu bạn chỉ cần một đơn DataTable - chỉ cần sử dụng và điền vào bảng dữ liệu đó một mình - không cần phí trên DataSet. Ngoài ra, đặt SqlConnection của bạn và SqlCommand vào sử dụng khối như thế này:

using (SqlConnection conn = new SqlConnection("Data Source=*******;Initial Catalog=ChatApp;User ID=Chatapplication;Password=****")) 
using (SqlCommand cmd = new SqlCommand("Chatroomapp", conn)) 
{ 
    string chatroomidno = textBox1.Text; 
    string chatroomname = textBox2.Text; 

    SqlDataAdapter adapt = new SqlDataAdapter(cmd); 
    adapt.SelectCommand.CommandType = CommandType.StoredProcedure; 
    adapt.SelectCommand.Parameters.Add(new SqlParameter("@ChatRoomID", SqlDbType.VarChar, 100)); 
    adapt.SelectCommand.Parameters["@ChatRoomID"].Value = chatroomidno; 
    adapt.SelectCommand.Parameters.Add(new SqlParameter("@ChatRoomName", SqlDbType.VarChar, 50)); 
    adapt.SelectCommand.Parameters["@ChatRoomName"].Value = chatroomname; 

    // fill the data table - no need to explicitly call `conn.Open()` - 
    // the SqlDataAdapter automatically does this (and closes the connection, too) 
    DataTable dt = new DataTable(); 
    adapt.Fill(dt); 

    if (dt.Rows.Count > 0) 
    { 
     MessageBox.Show("Connection Succedded"); 
    } 
    else 
    { 
     MessageBox.Show("Connection Fails"); 
    } 
} 

Và chỉ vì bạn nhận được lại không có hàng trong dt.Rows không nhất thiết có nghĩa là kết nối của bạn thất bại ..... nó chỉ có thể là có không có hàng nào phù hợp với critieria tìm kiếm của bạn! Kết nối hoạt động tốt - nhưng lệnh SQL không trả về bất kỳ hàng nào.

0

Kết nối không thành công có nghĩa là đã xảy ra sự cố giữa chương trình và cơ sở dữ liệu của bạn. Không có bản ghi nào được trả lại không có nghĩa là kết nối không thành công. Nó chỉ có nghĩa là bảng của bạn trống - nó không chứa các bản ghi.

Sử dụng ADO.NETstored procedures sẽ khác một chút so với những gì bạn đã làm. Nếu bạn cần kiểm tra xem kết nối có bị lỗi hay không, có thể kiểm tra loại ngoại lệ được trả lại trong phần catch là tốt hơn.

Dưới đây là cách tôi đã thực hiện. Tôi đã có thể tạo ra một phương pháp riêng biệt mà lại xoay xở được cuộc gọi của tôi, và sau đó trong button1_Click của bạn tôi sẽ vừa gọi phương pháp này:

public async Task<ChatRoom> GetAsync(string chatRoomId, string chatRoomName) 
{ 
    try 
    { 
      string connectionString = ConfigurationManager.ConnectionStrings["Db"].ConnectionString; 

      using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
      { 
       await sqlConnection.OpenAsync(); 

       using (SqlCommand sqlCommand = new SqlCommand("ChatRooms_Get", sqlConnection)) 
       { 
        sqlCommand.CommandType = CommandType.StoredProcedure; 
        sqlCommand.Parameters.Add(new SqlParameter("@ChatRoomID", chatRoomId)); 
        sqlCommand.Parameters.Add(new SqlParameter("@ChatRoomName", chatRoomName)); 

        using (SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync()) 
        { 
         ChatRoom chatRoom = null; 

         if (await sqlDataReader.ReadAsync()) 
         { 
           chatRoom = new ChatRoom(); 
           chatRoom.Id = sqlDataReader.GetFieldValue<string>(0); 
           chatRoom.Name = sqlDataReader.GetFieldValue<string>(1); 

           chatRooms.Add(chatRoom); 
         } 

         return chatRoom; 
        } 
       } 
      } 
    } 
    catch (Exception exception) 
    { 
      // Try checking if the connection failed here 

      throw exception; 
    } 
} 

phòng chat My domain model có thể trông như thế này:

public class ChatRoom 
{ 
    public string Id { get; set; } 

    public string Name { get; set; } 
} 

Và quy trình được lưu trữ sẽ có dạng như sau:

CREATE PROCEDURE [dbo].[ChatRooms_Get] 
(
    @ChatRoomID VARCHAR(100), 
    @ChatRoomName VARCHAR(50) 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
      ChatRoomID, 
      ChatRoomName 
    FROM 
      tblChatRoom 
    WHERE 
      ChatRoomID = @ChatRoomID 
      AND ChatRoomName = @ChatRoomName; 
END 

GO 

Và sau đó trong phương thức gọi, bạn sẽ nhận được phòng chat và thực hiện th nó bất cứ điều gì bạn cần làm với nó. Đối với ví dụ này tôi vừa kiểm tra xem nó có tồn tại hay không:

try 
{ 
    ChatRoom chatRoom = await chatRoomRepository.GetAsync(chatRoomId, chatRoomName); 
    if (chatRoom != null) 
    { 
      MessageBox.Show("Record found"); 
    } 
    else 
    { 
      MessageBox.Show("No record found"); 
    } 
} 
catch (Exception exception) 
{ 
    throw exception; 
} 

Tôi hy vọng điều này có thể hữu ích.

Các vấn đề liên quan