如何处理参数化查询需要未提供的参数
本文关键字:参数 查询 何处理 处理 | 更新日期: 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;
...
}
看起来整洁多了,不是吗?