【问题标题】:Empty Textbox still saves data in SQL Server even columns in table are not allowed null空文本框仍将数据保存在 SQL Server 中,即使表中的列不允许为空
【发布时间】:2015-10-12 19:11:34
【问题描述】:

我正面临这个问题,当我在所有文本框为空时单击保存按钮时,它会在所有文本框上显示星标。当我填充最后一个文本框而将所有其他文本框留空时,它会将数据保存到带有空字符串的数据库中。

我该如何处理这个问题?

if (tbIDCardNum.Text.Trim() == "")
{
    lblStarIDCardNum.Visibility = Visibility.Visible;
}

if (tbFirstName.Text.Trim() == "")
{
    lblStarFirstName.Visibility = Visibility.Visible;
}

if (rbMale.IsChecked == false && rbFemale.IsChecked == false)
{
    lblStarGender.Visibility = Visibility.Visible;
}

if (tbDOB.Text == "")
{
    lblStarDOB.Visibility = Visibility.Visible;
}

if (tbDateOfJoining.Text == "")
{
    lblStarDOJ.Visibility = Visibility.Visible;
}

if (tbEducation.Text.Trim() == "")
{
    lblStarEducation.Visibility = Visibility.Visible;
}

if (tbCNIC.Text.Trim() == "")
{
    lblStarCNIC.Visibility = Visibility.Visible;
}

if (tbSalary.Text.Trim() == "")
{
    lblStarSalary.Visibility = Visibility.Visible;
}

if (tbAddress.Text.Trim() == "")
{
    lblStarAddress.Visibility = Visibility.Visible;
}

if (tbEmail.Text.Trim() == "")
{
    lblStarEmail.Visibility = Visibility.Visible;
}

if (tbContact1.Text.Trim() == "")
{
    lblStarContact.Visibility = Visibility.Visible;
}
else
{
    try
    {
        conn.Open();

        cmd.CommandText = "insert into teacher (tIDCardNum, tFirstName, tLastName,tGender, tDOB, tCNIC, tEducation, tSalary, tJoinedOn, tAddress, tEmail, tContact1, tContact2, tContact3,tStatus) values ('" + tbIDCardNum.Text.Trim() + "' , '" + tbFirstName.Text.Trim() + "' , '" + tbLastName.Text.Trim() + "' , '" + gender + "' , '" + tbDOB.Text + "', '" + tbCNIC.Text + "' , '" + tbEducation.Text + "' , '" + tbSalary.Text.Trim() + "' , '" + tbDateOfJoining.Text.Trim() + "' , '" + tbAddress.Text.Trim() + "', '" + tbEmail.Text + "' , '" + tbContact1.Text + "' , '" + tbContact2.Text + "' , '" + tbContact3.Text + "',1)";

        cmd.Connection = conn;
        cmd.ExecuteNonQuery();

        cmd.Clone();
        conn.Close();

        HideStars();
        Refresh();

        MessageBox.Show("Saved");
   }
   catch (Exception ex)
   {
       if (ex.Message.Contains("Violation of PRIMARY KEY constraint "))
       {
           conn.Close();
           MessageBox.Show(ex.Message);
       }
       else
       {
           MessageBox.Show(ex.Message);
       }
   }
}

【问题讨论】:

  • 空并不意味着“空”。 sql null 是“未知”。空文本框只是一个长度为 0 的字符串 - 这不是未知的。
  • 如何让文本框发送 Null。或者检查文本框是否在 seding 空字符串
  • if (length(text_from_textbox) = 0) then sql_value = 'null'
  • 防止SQL注入,使用CommandParameter代替字符串连接。
  • 为什么要使用星标?请改用数据验证控件。如果要检查null,请参考this article

标签: c# sql-server database if-statement null


【解决方案1】:

据我了解,主要问题似乎是您检查了不同 if 语句中的所有字段,但 只有最后一个有 else。正如我从您的帖子中假设的那样,这是您的问题;您希望每个文本框在开始将其插入数据库之前都有一个值,对吗?

如果将你的代码分解成更可重用的东西,顺便清理一些东西,这会更好地解释。

首先,首先在您的类中引入一个变量,我们可以使用它来查看是否有 any 个空字段:

private bool HasEmptyFields = false;

接下来,让我们创建一个简单的助手来检查文本框是否为空/null,更新相应标签的可见性状态,如果确实为空,则将 'HasEmptyFields' 设置为 true:

private void ValidateField(TextBox textBox, Label label) {

    // check if the textbox actually is null - or empty (""), which is a difference
    // the nifty helper string.IsNullOrEmpty() will help with that
    var fieldIsEmpty = string.IsNullOrEmpty(textBox.Text.Trim());

    // next, based on if the field is empty,  set the visibility of the label
    // don't worry, this is fancy syntax for a simple if...then...else
    label.Visibility = fieldIsEmpty ? Visibility.Visible : Visibility.Hidden;

    if (fieldIsEmpty) {
        // ONLY if this field is actually null, or empty, we make sure to 
        // inform the rest of the code this occ
        HasEmptyFields = true;
    }
}

有了这个,我们可以做这样的事情:

ValidateField(tbIDCardNum, lblStarIDCardNum);
ValidateField(tbFirstName, lblStarFirstName);
// etc... continue doing this for all you fields

if (HasEmptyFields) {
    // ONLY if there is any field detected as being empty/null
    // we simply stop here (and skip the insert-into-db stuff)
    return;
} 

try 
{
    // if all fields indeed have a value, let's
    // continue with the insert-into-db stuff here

    conn.Open();
    ...
} 

现在肯定有办法让它变得更漂亮。但这可能会帮助您朝着正确的方向前进。还值得一提的是其他一些 cmets,例如防止 SQL injection(这一定会发生),以及研究数据验证工具,这样您就不必自己编写所有这些验证代码。但这显然不在此答案的范围内。

【讨论】:

    【解决方案2】:

    如果您想要求填写字段,那么您确实应该使用必填字段验证器 - 请参阅https://msdn.microsoft.com/en-us/library/5hbw267h%28VS.80%29.aspx?f=255&MSPPError=-2147217396

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2015-08-21
      • 2016-02-20
      相关资源
      最近更新 更多