如何处理参数化查询需要未提供的参数

本文关键字:参数 查询 何处理 处理 | 更新日期: 2023-09-27 18:03:05

我在一个按钮点击插入数据。我正试图处理该领域的异常。我的代码是:

try
        {
            con.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "INSERT INTO omotnica (id,name,date,number)" +
                                    "VALUES(@id,@naziv_predmeta,@date,@number)";
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = idInt;
            cmd.Parameters.Add("@name", SqlDbType.NVarChar, 300).Value = this.textBoxName.Text;
            try
            {
                DateTime datt = DateTime.Parse(textBoxDatumUpisa.Text);
                textBoxDatumUpisa.Text = datt.ToString("d/M/yyyy");
                cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = datt;
            }
            catch (FormatException)
            {
                MessageBox.Show("Date must be dd/MM/yyyy"); 
            }
            try
            {
                cmd.Parameters.Add("@number", SqlDbType.Int).Value = Convert.ToInt32(textBoxNumber.Text);
            }
            catch (SqlException e) when (e.Number == 8178)
            {
                MessageBox.Show("U must enter something");
            }
            catch (FormatException)
            {
                MessageBox.Show("It must be an integer");
            }
            con.Close();
             MessageBox.Show("Saved!");
        }
        catch (Exception ex)
        {
            MessageBox.Show(" error" + ex.Message + ex.Source );
        }try
        {
            con.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "INSERT INTO omotnica (id,name,date,number)" +
                                    "VALUES(@id,@naziv_predmeta,@date,@number)";
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = idInt;
            cmd.Parameters.Add("@name", SqlDbType.NVarChar, 300).Value = this.textBoxName.Text;
            try
            {
                DateTime datt = DateTime.Parse(textBoxDatumUpisa.Text);
                textBoxDatumUpisa.Text = datt.ToString("d/M/yyyy");
                cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = datt;
            }
            catch (FormatException)
            {
                MessageBox.Show("Date must be dd/MM/yyyy"); 
            }
            try
            {
                cmd.Parameters.Add("@number", SqlDbType.Int).Value = Convert.ToInt32(textBoxNumber.Text);
            }
            catch (SqlException e) when (e.Number == 8178)
            {
                MessageBox.Show("U must enter something");
            }
            catch (FormatException)
            {
                MessageBox.Show("It must be an integer");
            }
            con.Close();
             MessageBox.Show("Saved!");
        }
        catch (Exception ex)
        {
            MessageBox.Show(" error" + ex.Message + ex.Source );
        }

当我在textBoxNumber中输入一些字符串时,它会触发一个FormatException和一个异常,参数化查询期望没有提供的参数。当我将textBox留空时,它将触发参数化查询,该查询需要未提供的参数。如何改变这种状况?我不是用SQLException catch覆盖了那个异常吗?我需要它触发一个消息框当它是空的或者它不是整数在文本框内

如何处理参数化查询需要未提供的参数

Convert.ToInt32(string . empty)将引发FormatException,因为它无法将空字符串解析为Int32值。

将无效字符串转换为Int32将引发FormatException,但也会引发SQLException,因为转换失败,还会引发参数化查询,因为它期望Int32。

你可以抓住系统。异常并打开可能的错误,而不是试图捕获两个异常:

catch (Exception ex)            
{                
    if (ex is FormatException)
    {
        if (string.IsNullOrEmpty(this.textboxName.Text){ 
            MessageBox.Show("U must enter something");
        } else {
            MessageBox.Show("It must be an integer");
        }
        return; 
     } 
     else if (ex is SqlException) {
        MessageBox.Show(ex.Message);
        return;
     }
   throw;
}

添加:if(textbox.Text == string.Empty) return;在Click事件开始时,所以这不会发生。而不是捕获这么多的异常,并显示一个消息框添加if条件,只处理应该发生的异常。

如果您想接收int输入,请使用numbericUpDown

您可以安全地尝试转换,而不会出现像这样的异常

int num;
if (!Int32.TryParse(textBoxNumber.Text, out num)) {
    MessageBox.Show("It must be an integer");
    return;
}

对于可能为空的文本列

object textValue = String.IsNullOrWhiteSpace(textBoxName.Text)
    ? (object)textBoxName.Text
    : (object)DBNull.Value;

请注意,您必须传递DBNull.Value而不仅仅是null作为参数,否则参数将被视为缺失。

如果你想显示错误信息:

if(String.IsNullOrWhiteSpace(textBoxName.Text)) {
    MessageBox.Show("It must be an integer");
    return;
}

但是,如果您试图同时转换文本框值、显示错误消息和构造SQL语句,那么代码将变得非常混乱。

值创建一个类
class Omotnica 
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public int Number { get; set; }
}

,并在第一步将值获取到这个类中。这也可以通过对象数据绑定来实现。这为您完成了所有的转换!

那么设置SQL命令就容易多了。

如果您仍然想手动处理文本框的值,您可以为这个

创建一个方法
private Omotnica GetValues()
{
    var o = new Omotnica();
    if (!Int32.TryParse(textBoxNumber.Text, out o.Number)) {
        return null;
    }
    if(String.IsNullOrWhiteSpace(textBoxName.Text)) {
        return null;
    }
    o.Name = textBoxName.Text;
    ... and so on
}

那么你可以像这样清理SQL部分

Omotnica o = GetValues();
if (o == null) {
    MessageBox.Show("Please enter something for number, name, ...");
} else {
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "INSERT INTO omotnica (id,name,date,number) VALUES (@id,...";
    cmd.Parameters.Add("@id", SqlDbType.Int).Value = o.ID;
    cmd.Parameters.Add("@name", SqlDbType.NVarChar, 300).Value = o.Name;
    ...
}

看起来整洁多了,不是吗?