今天用mvc进行新增数据,数据库字段设置为可空,传入参数值也为null,可是执行sql时发现插入失败没有提供参数。
打开SQL Server Profiler进行监控,发现sql语句如下(下面是我创建的一个小Demo测试)
exec sp_executesql N'insert into People(Name,Adress) values(@Name,@Adress)',N'@Name nvarchar(4),@Adress nvarchar(4000)',@Name=N'Mary',@Adress=default
我传入的后台代码传入的Adress为null值,到sql变成了default.(问题就出在这里,为什么微软要设置成这样,不解)
原因是C#的null不是SQL的null,Sql里面要使用DBNull
下面是我修改后的代码
1 public static string constr = "server=.;database=Star;uid=sa;pwd=sa"; 2 static void Main(string[] args) 3 { 4 SqlConnection con = new SqlConnection(constr); 5 string sql = "insert into People(Name,Adress) values(@Name,@Adress)"; 6 SqlParameter[] parm = new SqlParameter[] { 7 new SqlParameter("@Name","Tony"), 8 new SqlParameter("@Adress",null) 9 }; 10 using (SqlCommand cmd = new SqlCommand(sql, con)) 11 { 12 con.Open(); 13 foreach (SqlParameter item in parm) 14 { 15 cmd.Parameters.Add(item); 16 //如果为null设置成DBNull 17 if (item.Value == null) 18 { 19 cmd.Parameters[item.ToString()].Value = DBNull.Value; 20 } 21 } 22 cmd.ExecuteNonQuery(); 23 con.Close(); 24 } 25 }