国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

[SQL]躺著也中槍的datetime類型

2024-07-21 02:47:54
字體:
來源:轉載
供稿:網友
[SQL]躺著也中槍的datetime類型寫在前面

本來這個東西,我是不想在這里總結的,今天有初學者的朋友問我了,那就不得不說說了,你肯定也踩過這樣的坑,沒遇到,說明你運氣好,編碼習慣好。那還是言歸正傳吧。避免你中槍,還是掃一眼這篇文章吧。

一個例子

測試環境:sqlserver2012,vs2013

下面看一個簡單的例子,例子非常簡單,就不再寫注釋了。一個測試的數據表TB_UserInfo:

一個再簡單不過的表,自增的id,用戶名字,注冊時間,從上圖你也看到了,是允許為空的。

再弄一個簡單的測試程序。

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Data; 7 using System.Data.SqlClient; 8 namespace Wolfy.SQLDateTimeDemo 9 {10     class PRogram11     {12         static void Main(string[] args)13         {14             string strConn = "server=.;database=test;uid=sa;pwd=sa;";15             string strSql = "insert into TB_userInfo values(@Name,@RegDateTime)";16             UserInfo user = new UserInfo() { Name = "wolfy" };17             try18             {19                 using (SqlConnection conn = new SqlConnection(strConn))20                 {21                     using (SqlCommand cmd = new SqlCommand(strSql, conn))22                     {23                         cmd.Parameters.Add(new SqlParameter("@Name", user.Name));24                         cmd.Parameters.Add(new SqlParameter("@RegDateTime", user.RegDateTime));25                         conn.Open();26                         if (cmd.ExecuteNonQuery() > 0)27                         {28                             Console.WriteLine("注冊成功");29                         }30                         else31                         {32                             Console.WriteLine("注冊失敗");33                         }34                     }35                 }36             }37             catch (Exception ex)38             {39                 throw ex;40             }41         }42     }43     /// <summary>44     /// 用戶信息類45     /// </summary>46     class UserInfo47     {48         /// <summary>49         /// 編號50         /// </summary>51         public int Id { set; get; }52         /// <summary>53         /// 姓名54         /// </summary>55         public string Name { set; get; }56         /// <summary>57         /// 注冊時間58         /// </summary>59         public DateTime RegDateTime { set; get; }60     }61 }

我們知道,如果在使用類的屬性的時候,你不為他賦值,則采用默認值。

可見它是有默認值的。

那我們繼續往下走,再看看

出現了,這個異常,想必很多人都遇到過吧。

可以看出,vs中datetime類型的默認值與sqlserver中的datetime類型范圍的確存在沖突。突然有這樣的想法,為什么這兩種默認值不兼容呢?考慮到現在的軟件都會和數據庫相結合,這樣設計是不是有點不合理了?這東西,咱也是無法改變了,也只能選擇接收了。盡量做到規范設計吧。

有兩種做法可以解決這個問題:

方案一:

在添加數據的時候,為datetime類型的值賦值為當前時間。

1   UserInfo user = new UserInfo() { Name = "wolfy", RegDateTime=DateTime.Now };

方案二:

創建數據表的時候給時間類型的字段添加默認值約束

1 語法:2 ALTER TABLE table_name3 ADD CONSTRAINT constraint_name4 DEFAULT constant_expression [FOR column_name]5 參數說明:6  table_name:要創建默認約束的表名稱。7  constraint_name:默認約束名稱。8  constant_expression:默認值。
1 alter table tb_userinfo add constraint default_RegDateTime default getdate() for [RegDateTime]

這種做法比較保險。推薦!

總結

這個知識點再容易不過了,估計很多初學者都會踩這樣的坑,不過還好,踩過了就長記性了,也是有好處的。為什么會有這樣的問題?可能你對伙伴比較信任,潛意識覺得他肯定會在數據庫中添加默認約束的。到最后中槍的還是自己。所以在設計程序,編寫代碼的時候,一定要嚴謹!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 冕宁县| 珠海市| 福建省| 安仁县| 同心县| 永新县| 方山县| 曲水县| 盘锦市| 英超| 密山市| 九江市| 龙口市| 宜州市| 宜州市| 仁寿县| 荥阳市| 江西省| 高邮市| 循化| 滦平县| 柳林县| 收藏| 舒兰市| 兰西县| 蓝田县| 河池市| 时尚| 东港市| 东兰县| 剑河县| 襄城县| 秀山| 彭州市| 汝州市| 大城县| 渝北区| 昌乐县| 高台县| 固安县| 泌阳县|