本文轉(zhuǎn)載:http://blog.csdn.net/chybaby/article/details/2338943 今天碰到個(gè)問(wèn)題,。。SqlCommand對(duì)傳送的參數(shù)中如果字段的值是NULL具然不進(jìn)行更新操作,,也不提示任何錯(cuò)誤,。。,。百思不得其解,。。,。先作個(gè)記錄,,再查資料看看什么原因。 暫時(shí)的解決方法: 1,、Update不支持更新Null,先Delete后Insert來(lái)替換. 2,、替代Null的方法,對(duì)于字符型,只要是Null,改為空,語(yǔ)句中就是''. 找到了相關(guān)的解決方法 ADO.Net的Command對(duì)象如何向數(shù)據(jù)庫(kù)插入NULL值(原創(chuàng)) 一般來(lái)說(shuō),在Asp.Net與數(shù)據(jù)庫(kù)的交互中,,通常使用Command對(duì)象,,如:SqlCommand。通過(guò)Command對(duì)象對(duì)數(shù)據(jù)庫(kù)操作是相當(dāng)安全和方便的(相對(duì)于RecordSet方式),。但是,,同時(shí)發(fā)現(xiàn)了一個(gè)問(wèn)題,。像有些日期字段,如果用戶沒(méi)有選擇日期,,我們希望他保持NULL狀態(tài),。我寫(xiě)的關(guān)鍵代碼如下: SqlCommand sqlCmd = new SqlCommand(sqlStatment, dbConn); sqlCmd.Parameters.AddWithValue("@Name", name); sqlCmd.Parameters.AddWithValue("@Surname", surname);這時(shí),雖未出錯(cuò),,但返回的影響行數(shù)告訴我,。更新未成功。這是怎么回事呢,? 原來(lái)ADO.Net為了防止一些不容易找出的錯(cuò)誤,,在Command操作時(shí)加了一些限制。我們必須明確指示Command對(duì)象,,我們需要插入NUll值,。修改后的代碼如下: SqlCommand sqlCmd = new SqlCommand(sqlStatment, dbConn); sqlCmd.Parameters.AddWithValue("@Name", name); sqlCmd.Parameters.AddWithValue("@Surname", surname); sqlCmd.Parameters[0].IsNullable = true; sqlCmd.Parameters[1].IsNullable = true;不過(guò),還有一點(diǎn)要注意的就是,,這里的IsNullable,,不是說(shuō)你可以插入null值,而是指DBNull.Value值,。 希望這點(diǎn)小經(jīng)驗(yàn)會(huì)對(duì)大家有幫助,。 方法一、 public int UpdateFeedBackStatus(int _feedBackID, int _status, object _RequestDateTime) { SqlParameter[] param = { new SqlParameter("@FeedBackID", _feedBackID), new SqlParameter("@FeedBackStatusID", _status), new SqlParameter("@RequestDateTime", _RequestDateTime) }; StringBuilder strSql = new StringBuilder(); strSql.Append("UPDATE dbo.FeedBack "); strSql.Append("SET FeedBackStatusID=@FeedBackStatusID,RequestDateTime=@RequestDateTime "); strSql.Append("WHERE FeedBackID=@FeedBackID "); return DbHelper.ExecuteNonQuery(CommandType.Text,strSql.ToString(),param); } 調(diào)用: feedBackBLL.UpdateFeedBackStatus(_feedBackID, 4, DBNull.Value); 或者feedBackBLL.UpdateFeedBackStatus(_feedBackID, 4,null); 方法二: public int UpdateFeedBackStatus(int _feedBackID, int _status, DateTime? _RequestDateTime) { SqlParameter[] param = { new SqlParameter("@FeedBackID", _feedBackID), new SqlParameter("@FeedBackStatusID", _status), new SqlParameter("@RequestDateTime", _RequestDateTime) }; param[2].IsNullable = true; StringBuilder strSql = new StringBuilder(); strSql.Append("UPDATE dbo.FeedBack "); strSql.Append("SET FeedBackStatusID=@FeedBackStatusID,RequestDateTime=@RequestDateTime "); strSql.Append("WHERE FeedBackID=@FeedBackID "); return DbHelper.ExecuteNonQuery(CommandType.Text,strSql.ToString(),param); } 調(diào)用: feedBackBLL.UpdateFeedBackStatus(_feedBackID, 4,null); 二,、C#中往數(shù)據(jù)庫(kù)插入空值的問(wèn)題 在用C#往數(shù)據(jù)庫(kù)里面插入記錄的時(shí)候, 可能有的字段你不賦值,那么這個(gè)字段的值就為null, 如果按一般想法的話,這個(gè)值會(huì)被數(shù)據(jù)庫(kù)接受, 然后在數(shù) 據(jù)表里面顯示為NUll, 實(shí)際上這就牽扯到一個(gè)類型的問(wèn)題, C#中的NUll于SQL中的null是不一樣的, SQL中的null用C#表示出來(lái)就 是DBNull.Value, 所以在進(jìn)行Insert的時(shí)候要注意的地方. Example: SqlCommand cmd=new SqlCommand("Insert into Student values(@StuName,@StuAge)" ,con); cmd.parameters.add("@StuName" ,stuname); cmd.parameters.add("@StuAge" ,stuage); cmd.ExecuteNonQuery(); 這些代碼看似沒(méi)有問(wèn)題, 其實(shí)當(dāng)stuname于stuage中的任何一個(gè)值為null的時(shí)候, 這代碼就會(huì)報(bào)錯(cuò)...汗!!! 解決辦法: 其實(shí)最簡(jiǎn)單的辦法就是進(jìn)行判斷, 當(dāng)stuname或stuage為空時(shí), 插入DBNull.Value. 但是這樣當(dāng)一個(gè)數(shù)據(jù)庫(kù)有很多字段時(shí)或者是有很多張表時(shí), 代碼就會(huì)很多了,我也沒(méi)有找到特別方便的方法,我的方法是:寫(xiě)一個(gè)靜態(tài)的方法來(lái)對(duì)變量的值進(jìn)行判斷: Example : static public object SqlNull(object obj) { if (obj == null ) return DBNull.Value; return obj; } //用上面的方法對(duì)參數(shù)進(jìn)行了判斷 cmd.parameters.add("@StuName" ,SqlNull(stuname)); cmd.parameters.add("@StuAge" ,SqlNull(stuage)); cmd.ExecuteNonQuery(); |
|
來(lái)自: _明心見(jiàn)性_ > 《C#編程》