SqlParameterCollection只接受非null的SqlParameter类型对象,而不接受DBNull对象
本文关键字:对象 类型 DBNull 不接受 SqlParameter null SqlParameterCollection | 更新日期: 2023-09-27 18:29:04
每当我在文本框中不键入任何内容或键入空值时,就会出现一个错误。我的代码是这样的:
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();
错误出现在:
if(cmd.Parameters.Contains(System.DBNull.Value))
我使用的是SQL Server和C#。
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();
}
为什么不重新开始,在达到这一点之前进行一些适当的验证?如果没有必要的话,你永远不应该开始创建对象和东西
private bool IsValid()
{
return !Controls.OfType<TextBox>().Any(c=> String.IsNullOrEmpty(c.Text));
}
然后在代码之前添加一个调用,以构建sqlcommand和参数集合
if(IsValid())
{
// do you stuff here
}
else
{
MessageBox.Show("Please complete the fields", "Information...",
MessageBoxButtons.OK, MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button1);
}
请记住,这还没有经过测试,我现在没有VS,而且所有内容都是手动编写的,所以可能无法以这种方式访问Control集合。
首先,您需要查找任何参数的值属性是否为DBNull。您正在尝试检查参数对象本身是否为DBNull,但应该查看Value属性。你可以这样做:
if ( cmd.Parameters.Any(p => DBNull.Value.Equals(p.Value)) )
其次,文本框控件的.Text
属性永远不会为null。最坏的情况是,它将是空字符串。所以你真正想要的是这样的代码:
if ( cmd.Parameters.Any(p => string.IsNullOrWhiteSpace((string)p.Value)) )
最后,顺便说一句,即使.Text
属性可以是null
,这也与DBNull
不同。它们是两种不同的东西。
干净有效的方法。将在以后的发展中帮助您。更改代码如下:
-
创建一个名为student的类,并在该类中根据需要为
FirstName
、LastName
和其他类创建属性。类似这样的东西: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. }
-
创建一个单独的方法来为
SqlCommand
分配参数。在这些方法中,如果需要使用三元运算,也可以进行验证,即?,: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); }
-
创建一个保存方法,并将上面的类作为参数传递。您还可以创建一个名为
Student
的单独分部类,以便使用同一实例访问成员。调用步骤2中的方法,以便使用参数。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() } } } }