private void button1_Click(object sender, EventArgs e) { try { SqlConnection conn = new SqlConnection(); conn.ConnectionSsortingng = "Data Source=*******;Initial Catalog=ChatApp;User ID=Chatapplication;Password=****"; conn.Open(); SqlCommand cmd = new SqlCommand(); ssortingng chatroomidno = textBox1.Text; ssortingng chatroomname = textBox2.Text; //cmd.CommandText = "Select ChatRoomID=@ChatRoomID,ChatRoomName=@ChatRoomName 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); } }
tout en compilant le programme j'ai eu seulement la connection échoue boîte de message, dans la database j'ai trouvé correct, comment surmonter le programme pour get la boîte de message de connection réussie
Eh bien, vous remplissez l'set de données ds
– mais alors vous vérifiez la table de données dt
pour la présence de lignes … cela ne fonctionnera jamais, bien sûr!
Si vous n'avez besoin que d'un seul DataTable
, il vous suffit d'utiliser et de remplir cette table de données seule, sans avoir besoin de la surcharge d'un DataSet
. En outre, mettez vos SqlConnection
et SqlCommand
en utilisant des blocs comme ceci:
using (SqlConnection conn = new SqlConnection("Data Source=*******;Initial Catalog=ChatApp;User ID=Chatapplication;Password=****")) using (SqlCommand cmd = new SqlCommand("Chatroomapp", conn)) { ssortingng chatroomidno = textBox1.Text; ssortingng 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"); } }
Et juste parce que vous ne récupérez aucune ligne dans dt.Rows
ne signifie pas nécessairement que votre connection a échoué ….. il se peut qu'il n'y ait aucune ligne correspondant à votre critère de search! La connection a fonctionné correctement, mais la command SQL n'a renvoyé aucune ligne.
La connection a échoué signifie que quelque chose s'est mal passé entre votre programme et la database. Aucun logging renvoyé ne signifie pas que la connection a échoué. Cela signifie simplement que votre table est vide – elle ne contient aucun logging.
Utiliser ADO.NET
et une stored procedures
aurait été un peu différent de ce que vous avez fait. Si vous avez besoin de vérifier si la connection a échoué, il est peut-être préférable de vérifier le type d'exception renvoyé dans la partie catch
.
Voici comment je l'aurais fait. J'aurais créé une méthode séparée qui aurait traité mon appel, et dans votre button1_Click
j'aurais juste appelé cette méthode:
public async Task<ChatRoom> GetAsync(ssortingng chatRoomId, ssortingng chatRoomName) { try { ssortingng connectionSsortingng = ConfigurationManager.ConnectionSsortingngs["Db"].ConnectionSsortingng; using (SqlConnection sqlConnection = new SqlConnection(connectionSsortingng)) { 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<ssortingng>(0); chatRoom.Name = sqlDataReader.GetFieldValue<ssortingng>(1); chatRooms.Add(chatRoom); } return chatRoom; } } } } catch (Exception exception) { // Try checking if the connection failed here throw exception; } }
Mon domain model
salon de discussion aurait pu ressembler à ceci:
public class ChatRoom { public ssortingng Id { get; set; } public ssortingng Name { get; set; } }
Et la procédure stockée aurait ressemblé à ceci:
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
Et puis, dans la méthode d'appel, vous obtiendrez le salon de discussion et ferez avec tout ce que vous devez faire avec. Pour cet exemple, je viens de vérifier s'il existe ou non:
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; }
J'espère que cela peut aider.