2013-08-04 12 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); 
     } 
    } 

, während das Programm kompiliert bekam ich nur Verbindung fehlschlägt Meldungsfeld in der Datenbank fand ich richtig, wie das Programm zu überwinden, um die Verbindung succeded MeldungsfeldWie eine gespeicherte Prozedur aufzurufen ado.net mit

zu bekommen

Antwort

7

Nun, Sie füllen den ds Datensatz - aber dann überprüfen Sie die dt Datentabelle für die Anwesenheit von Zeilen ... das wird natürlich nie funktionieren!

Wenn Sie nur eine einzige DataTable benötigen - nur verwenden und füllen Sie diese Datentabelle allein - keine Notwendigkeit für den Overhead von DataSet. Außerdem setzen Sie Ihre SqlConnection und SqlCommand in Blöcke wie folgt aus:

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

Und nur weil Sie wieder keine Zeilen in dt.Rows bekommen bedeutet nicht unbedingt, dass Ihre Verbindung nicht ..... es könnte nur sein, dass es sind keine Zeilen, die Ihren Suchkriterien entsprechen! Die Verbindung funktionierte einwandfrei - aber der SQL-Befehl gab nur keine Zeilen zurück.

0

Verbindung fehlgeschlagen bedeutet, dass zwischen Ihrem Programm und der Datenbank ein Fehler aufgetreten ist. Keine zurückgegebenen Datensätze bedeutet nicht, dass die Verbindung fehlgeschlagen ist. Es bedeutet nur, dass Ihre Tabelle leer ist - sie enthält keine Datensätze.

Mit ADO.NET und ein stored procedures wäre ein wenig anders gewesen von dem, was Sie es getan haben. Wenn Sie überprüfen müssen, ob die Verbindung fehlgeschlagen ist, ist es möglicherweise besser, den Typ der Ausnahme zu überprüfen, die im catch-Teil zurückgegeben wird.

Unten ist, wie ich es getan hätte. Ich hätte eine separate Methode geschaffen, die meinen Anruf behandelt hätte, und dann in Ihrem button1_Click würde ich nur diese Methode aufgerufen haben:

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

Mein Chat-Raum domain model so ausgesehen haben könnte:

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

    public string Name { get; set; } 
} 

und die gespeicherte Prozedur wie diese ausgesehen haben würde:

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 

in der aufrufenden Methode würden Sie den Chatroom bekommen und wi und dann tun Was immer du damit zu tun hast. Für dieses Beispiel habe ich gerade überprüft, ob es existiert oder nicht:

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

Ich hoffe, dass dies helfen kann.

Verwandte Themen