Montag, Januar 27, 2020

Die SqlParameterCollection akzeptiert nur nicht-null-SqlParameter-Art-Objekte, nicht DBNull Objekte

Immer, wenn ich nichts eingeben oder null-Wert in die Textfelder ein Fehler kommt. Mein code ist wie folgt:

 SqlCommand cmd = con.CreateCommand();
 cmd.CommandText = "INSERT INTO Records 
                   ([Student ID], [First Name], [Last Name], [Middle Initial], 
                     Gender, Address, Status, Year, Email, Course, 
                    [Contact Number]) 
                    VALUES (@StudentID, @FirstName, @LastName , @MiddleInitial, 
                            @Gender, @Address, @Status, @Year, @Email, @Course, 
                            @ContactNumber)";

   SqlParameter p1 = new SqlParameter("@StudentID", SqlDbType.NChar);
   p1.Value = textBox1.Text;
   cmd.Parameters.Add(p1);
   SqlParameter p2 = new SqlParameter("@FirstName", SqlDbType.NVarChar);
   p2.Value = textBox2.Text;
   cmd.Parameters.Add(p2);
   SqlParameter p3 = new SqlParameter("@LastName", SqlDbType.NVarChar);
   p3.Value = textBox3.Text;
   cmd.Parameters.Add(p3);
   SqlParameter p4 = new SqlParameter("@MiddleInitial", SqlDbType.NChar);
   p4.Value = comboBox1.Text;
   cmd.Parameters.Add(p4);
   SqlParameter p5 = new SqlParameter("@Gender", SqlDbType.NChar);
   p5.Value = comboBox2.Text;
   cmd.Parameters.Add(p5);
   SqlParameter p6 = new SqlParameter("@Address", SqlDbType.VarChar);
   p6.Value = textBox4.Text;
   cmd.Parameters.Add(p6);
   SqlParameter p7 = new SqlParameter("@Status", SqlDbType.NChar);
   p7.Value = comboBox3.Text;
   cmd.Parameters.Add(p7);
   SqlParameter p8 = new SqlParameter("@Year", SqlDbType.VarChar);
   p8.Value = comboBox4.Text;
   cmd.Parameters.Add(p8);
   SqlParameter p9 = new SqlParameter("@Email", SqlDbType.VarChar);
   p9.Value = textBox5.Text;
   cmd.Parameters.Add(p9);
   SqlParameter p10 = new SqlParameter("@Course", SqlDbType.VarChar);
   p10.Value = comboBox5.Text;
   cmd.Parameters.Add(p10);
   SqlParameter p11 = new SqlParameter("@ContactNumber", SqlDbType.VarChar);
   p11.Value = textBox6.Text;
   cmd.Parameters.Add(p11);

   textBox1.Text = "";
   textBox2.Text = "";
   textBox3.Text = "";
   textBox4.Text = "";
   textBox5.Text = "";
   textBox6.Text = "";
   comboBox1.Text = "";
   comboBox2.Text = "";
   comboBox3.Text = "";
   comboBox4.Text = "";
   comboBox5.Text = "";
   if (cmd.Parameters.Contains(System.DBNull.Value))
   {
       MessageBox.Show("Please complete the fields", "Information...", 
                       MessageBoxButtons.OK, MessageBoxIcon.Warning, 
                       MessageBoxDefaultButton.Button1);
    }
    else
    {
       MessageBox.Show("Data Inserted!", "Information ... ", 
                       MessageBoxButtons.OK, MessageBoxIcon.Information, 
                       MessageBoxDefaultButton.Button1);
    }
    cmd.ExecuteNonQuery();
    con.Close();

Ist der Fehler auf:

if(cmd.Parameters.Contains(System.DBNull.Value))

Ich bin mit SQL-Server und C#.

  • Sie brauchen, um zu überprüfen, ob der Wert, den Sie setzen ist null vor, ordnen Sie alles, um den Befehl Parameter. Wenn Ihr ein Textfeld, dann möchten Sie vielleicht zu prüfen if(!string.IsNullOrEmpty(textbox.text)) //Then add the parameter
  • Ich Tat, was Sie gesagt haben, aber es hält beim einlegen einer Daten-auch wenn es null ist.

4 Kommentare

  1. 1
    SqlCommand cmd = con.CreateCommand();
    cmd.CommandText = "INSERT INTO Records 
                   ([Student ID], [First Name], [Last Name], [Middle Initial], 
                     Gender, Address, Status, Year, Email, Course, 
                    [Contact Number]) 
                    VALUES (@StudentID, @FirstName, @LastName , @MiddleInitial, 
                            @Gender, @Address, @Status, @Year, @Email, @Course, 
                            @ContactNumber)";
    Control[] controls = {textBox1,textBox2, textBox3, textBox4, textBox5, textBox6, comboBox1, comboBox2, comboBox3, comboBox4, comboBox5};
    foreach(Control c in controls){
      if(c.Text.Trim() == "") {
          MessageBox.Show("Please complete the fields", "Information...", 
                       MessageBoxButtons.OK, MessageBoxIcon.Warning, 
                       MessageBoxDefaultButton.Button1);
          c.Focus();//Focus it to let user enter some value again.
          return;
    
      }
    }
    //Initialize your parameters here
    //....
    //....
    //....
    
    try {
      cmd.ExecuteNonQuery();        
      MessageBox.Show("Data Inserted!", "Information ... ", 
                       MessageBoxButtons.OK, MessageBoxIcon.Information, 
                       MessageBoxDefaultButton.Button1);
      foreach(Control c in controls) c.Text = "";
    }catch{}
    finally {
      con.Close();
    }
  2. 0

    Warum gehst du nicht wieder von vorne anfangen und tun einige richtige Validierung, bevor man zu diesem Punkt? Sie sollten nie beginnen, Objekte zu erstellen und Zeug, wenn es gibt keine Notwendigkeit, dies zu tun. Also, machen Sie sich selbst einen gefallen und fügen Sie eine Validierung der Methode wie in

    private bool IsValid()
    {
        return !Controls.OfType<TextBox>().Any(c=> String.IsNullOrEmpty(c.Text));
    }

    dann rufen Sie einfach vor den code zu konstruieren, das sqlcommand-Objekt und parameter-Auflistung

    if(IsValid())
    {
        //do you stuff here
    }
    else
    {
       MessageBox.Show("Please complete the fields", "Information...", 
                       MessageBoxButtons.OK, MessageBoxIcon.Warning, 
                       MessageBoxDefaultButton.Button1);
    }

    Denken Sie daran, dies ist nicht getestet, habe ich nicht die VS jetzt und alles ist von Hand geschrieben, so vielleicht Steuern Sammlung wird nicht zugegriffen, auf diese Weise.

  3. 0

    Zunächst müssen Sie schauen, ob die Wert Eigenschaft der Parameter ist DBNull. Sie versuchen, überprüfen Sie, ob parameter-Objekt selbst ist DBNull, aber Sie sollten einen Blick auf die Value-Eigenschaft. Sie können tun, wie diese:

    if ( cmd.Parameters.Any(p => DBNull.Value.Equals(p.Value)) )

    Zweitens, die .Text Eigenschaft der textbox-Steuerelemente wird nie null sein. Im schlimmsten Fall, wird der leere string. Also, was Sie wirklich wollen, ist ein code wie dieser:

    if ( cmd.Parameters.Any(p => string.IsNullOrWhiteSpace((string)p.Value)) )

    Schließlich, wie nebenbei, auch wenn die .Text Eigenschaft könnte null, das ist nicht das gleiche wie DBNull. Sie sind zwei verschiedene Dinge.

    • Joel, schönes Stück code, aber ich dachte das muss gut sein für die intermediate-Entwickler und oben, wie aus dem code des OP, es scheint, er ist starter und ist nicht in der Lage zu starten mit LINQ und Anonyme Art von Dingen..Aber wenn er versteht, dann ist es wirklich hilfreich sein wird für ihn.
  4. 0

    Sauber und wirkungsvoll. Wird Ihnen helfen, in späteren Entwicklungen. Ändern Sie Ihren code so etwas wie dieses:

    1. Erstellen Sie eine Klasse namens “ student und in dieser Klasse erstellen, die Eigenschaften für FirstName, LastName und andere, wie erforderlich. So etwas wie dieses:

      public class Student
      {
          public int StudentId {get;set;}
          public string FirstName {get;set;}
          public string FirstName {get;set;}
          public string MiddleInitial{get;set;} //upto ContactNumber or as required.
       }
    2. Erstellen Sie eine separate Methode für die Zuweisung von Parameter zu SqlCommand. Hier in diesen Methoden können Sie auch Validierungen, wenn Sie erforderlich ternäre Operationen ich.e ?,:

      private void CreateParameterList(ref Student s, ref SqlCommand cmd)
             {
                var parameters = new []
                                     {
                                       new SqlParameter("@FirstName",s.FirstName),
                                       new SqlParameter("@LastName",s.LastName),
                                       :
                                       :
                                        new SqlParameter("@ContactNumber",s.ContactNumber)
                                      }
                cmd.Parameters.AddRange(parameters);
             }
    3. Erstellen Sie eine Methode zum Speichern und weitergeben der oben genannten Klasse als parameter. Sie können auch eine separate partial-Klasse im Namen der Student so den Zugriff auf die Mitglieder, die dieselbe Instanz. Rufen Sie die Methode in Schritt 2, um die Parameter.

      protected void MySaveFunction(Student s)
      {
          using(SqlConnection con= new SqlConnection(your_Connection_String))
          {
              using(SqlCommmand cmd = new SqlCommand())
              {
                  cmd.CommandType = CommandType.Text/StoredProcedure;
                  //it depends on what you are using
                  cmd.Connection = con;
                  cmd.CommandText=Your Query or Name of SP;
                  con.Open();
                  CreateParameterList(ref s, ref cmd);
                  try
                  {
                      int i = cmd.ExecuteNonQuery();
                      if(i>0)
                      {
                          //Show Success or return Success
                      }        
                  }
                  catch(SqlException sqlex)
                  {
                      //catch and log exception
                  }
                  finally
                  {  con.Close(); con.Dispose() }
              }
          }
      }
    • Warum deklarieren Student und SqlCommand als ref-Parameter in CreateParameterList?
    • Sowohl Schüler und SqlCommand sind Klassen, so sind durch Verweis übergeben standardmäßig. Es gibt keine Notwendigkeit, ref. Siehe albahari.com/valuevsreftypes.aspx
    • Ihre nicht obligatorisch, dass ich Schreibe, ref und er muss auf ref. Wenn Sie sehen können, mein code, den ich ausgelassen habe, so viele Eigenschaften und Parameter, so dass doesnot bedeuten, dass die OP sollte auch überspringen Sie diese. Der obige code ist nur ein Vorschlag oder Tipp gegeben für die Erkundung der neuen Möglichkeiten der Umsetzung von Futtermitteln. Wenn er kann forschen, er muß dann in der Lage sein zu stoßen , der Dutzende von Möglichkeiten, das gleiche zu tun. Es hängt davon ab, auf ihn, auf welche Weise er braucht und die er bevorzugt?

Kostenlose Online-Tests