2013-05-02 61 views
0

使用Visual Studio .NET 2003的Im时,添加按钮在所有文本框,组合框字段都填充数据时工作正常,但是在测试时未填充数据字段时将数据留空NULL它返回错误说“字符串未被识别为有效的DateTime”允许将空值保存在数据库中

我有一个名为txtPurchasedDate

我的存储过程

CREATE PROCEDURE AddOfficeEquipmentProfile 
    (
    @OE_ID  varchar(11)  = NULL, 
    @OE_Category  char(3)   = NULL, 
    @OE_SubCategory char(3)   = NULL, 
    @OE_Name  varchar(35)  = NULL, 
    @OE_User  varchar(35)  = NULL, 
    @OE_Brand  varchar(15)  = NULL, 
    @OE_Model  varchar(35)  = NULL, 
    @OE_Specs  varchar(1000)  = NULL, 
    @OE_SerialNo  varchar(35)  = NULL, 
    @OE_PropertyNo varchar(35)  = NULL, 
    @OE_MacAddress varchar(100)  = NULL, 
    @OE_Static_IP  varchar(15)  = NULL, 
    @OE_Vendor  varchar(35)  = NULL, 
    @OE_PurchaseDate smalldatetime  = NULL, 
    @OE_WarrantyInclusiveYear int  = NULL, 
    @OE_WarrantyStatus char(2)   = NULL, 
    @OE_Status  varchar(15)  = NULL, 
    @OE_Dept_Code char(3)   = NULL, 
    @OE_Location_Code char(8)   = NULL, 
    @OE_Remarks  varchar(1000)  = NULL 
    ) 
    AS 

    INSERT INTO tblOfficeEquipmentProfile (OE_ID, OE_Category, OE_SubCategory, OE_Name, OE_User, OE_Brand, OE_Model, OE_Specs, OE_SerialNo, 
    OE_PropertyNo, OE_MacAddress, OE_Static_IP, OE_Vendor, OE_PurchaseDate, OE_WarrantyInclusiveYear, OE_WarrantyStatus, OE_Status, OE_Dept_Code, 
    OE_Location_Code, OE_Remarks) 
    VALUES (@OE_ID, @OE_Category, @OE_SubCategory, @OE_Name, @OE_User, @OE_Brand, @OE_Model, 
    @OE_Specs, @OE_SerialNo, @OE_PropertyNo, @OE_MacAddress, @OE_Static_IP, @OE_Vendor, @OE_PurchaseDate, @OE_WarrantyInclusiveYear, @OE_WarrantyStatus, 
    @OE_Status, @OE_Dept_Code, @OE_Location_Code, @OE_Remarks) 

    IF @@ERROR<>0 
     BEGIN 
      ROLLBACK TRANSACTION 
      RETURN 0 
     END 
    ELSE 
     BEGIN 
      COMMIT TRANSACTION 
      RETURN 1 
     END 
    GO 

我Vb.net添加按钮代码

文本框
Dim cmd As SqlCommand = sqlconn.CreateCommand 
     sqlconn.Open() 
     cmd.CommandType = CommandType.StoredProcedure 
     cmd.CommandText = "AddOfficeEquipmentProfile" 

    cmd.Parameters.Add("@OE_ID", SqlDbType.VarChar, 11, "oeq-su-999") 
    cmd.Parameters.Add("@OE_Category", SqlDbType.Char, 3, "COM") 
    cmd.Parameters.Add("@OE_SubCategory", SqlDbType.Char, 3, "SU") 
    cmd.Parameters.Add("@OE_Name", SqlDbType.VarChar, 35, "adminpmis01") 
    cmd.Parameters.Add("@OE_User", SqlDbType.VarChar, 35, "Ivan") 
    cmd.Parameters.Add("@OE_Brand", SqlDbType.VarChar, 15, "DELL") 
    cmd.Parameters.Add("@OE_Model", SqlDbType.VarChar, 35, "optiplex") 
    cmd.Parameters.Add("@OE_Specs", SqlDbType.VarChar, 1000, "dualcore") 
    cmd.Parameters.Add("@OE_SerialNo", SqlDbType.VarChar, 35, "sgh5960") 
    cmd.Parameters.Add("@OE_PropertyNo", SqlDbType.VarChar, 35, "j7h7h6g6f2") 
    cmd.Parameters.Add("@OE_MacAddress", SqlDbType.VarChar, 100, "j7h7:h6g6f2") 
    cmd.Parameters.Add("@OE_Static_IP", SqlDbType.VarChar, 15, "192.168.1.5") 
    cmd.Parameters.Add("@OE_Vendor", SqlDbType.VarChar, 35, "ADWAYS") 

    cmd.Parameters.Add("@OE_PurchaseDate", SqlDbType.SmallDateTime) 
    cmd.Parameters.Add("@OE_WarrantyInclusiveYear", SqlDbType.Int) 
    cmd.Parameters.Add("@OE_WarrantyStatus", SqlDbType.Char, 2, "IN") 
    cmd.Parameters.Add("@OE_Status", SqlDbType.VarChar, 15, "Good") 
    cmd.Parameters.Add("@OE_Dept_Code", SqlDbType.Char, 3, "ADM") 
    cmd.Parameters.Add("@OE_Location_Code", SqlDbType.Char, 8, "ADM_OFC") 
    cmd.Parameters.Add("@OE_Remarks", SqlDbType.VarChar, 1000, "ACTIVE") 
    cmd.Parameters("@OE_ID").Value = txtOEID.Text 
    cmd.Parameters("@OE_Category").Value = cmbCategory.Text 
    cmd.Parameters("@OE_SubCategory").Value = cmbSubCategory.Text 
    cmd.Parameters("@OE_Name").Value = txtName.Text 
    cmd.Parameters("@OE_User").Value = txtUser.Text 
    cmd.Parameters("@OE_Brand").Value = cmbBrand.Text 
    cmd.Parameters("@OE_Model").Value = cmbModel.Text 
    cmd.Parameters("@OE_Specs").Value = txtSpecs.Text 
    cmd.Parameters("@OE_SerialNo").Value = txtSerialNo.Text 
    cmd.Parameters("@OE_PropertyNo").Value = txtPropertyNo.Text 
    cmd.Parameters("@OE_MacAddress").Value = txtMacAddress.Text 
    cmd.Parameters("@OE_Static_IP").Value = txtStaticIp.Text 
    cmd.Parameters("@OE_Vendor").Value = txtVendor.Text 
    cmd.Parameters("@OE_PurchaseDate").Value = txtPurchaseDate.Text 
    cmd.Parameters("@OE_WarrantyInclusiveYear").Value = txtWarrantyInclusiveYear.Text 
    cmd.Parameters("@OE_WarrantyStatus").Value = txtWarrantyStatus.Text 
    cmd.Parameters("@OE_Status").Value = txtStatus.Text 
    cmd.Parameters("@OE_Dept_Code").Value = cmbDeptCode.Text 
    cmd.Parameters("@OE_Location_Code").Value = cmbLocationCode.Text 
    cmd.Parameters("@OE_Remarks").Value = txtRemarks.Text 
    cmd.ExecuteNonQuery() 
    MsgBox("Successfully Added Equipment Profile") 
    sqlconn.Close() 
+0

什么格式是你的PAS而purchaseDate登录? – Jason 2013-05-02 01:03:43

+0

dd/mm/yyyy @Jason – ivandinglasan 2013-05-02 01:05:38

+0

如果您传入空日期,您需要确保您的数据库设置为允许空值。每列可以设置为允许空值。 – Jason 2013-05-02 01:08:33

回答

2

如果要存储空值,则必须在vb代码中使用条件逻辑,以便不将这些参数发送到存储过程,或发送dbnull值。即使你的字符字段存储空字符串,这可能不是你的意图。

+0

语法和逻辑怎么会先生? – ivandinglasan 2013-05-02 01:05:57

+0

好神人,至少把你自己的一些努力加入其中。 – JohnFx 2013-05-02 02:35:01

+0

@JohnFx我不想问问,如果我没有用完想法,已经尝试dbNULL。我先尝试不同的事情,然后在发布 – ivandinglasan 2013-05-02 03:41:06

0

使用

If (Not String.IsNullOrEmpty(txtPurchaseDate.Text)) Then 
    cmd.Parameters("@OE_PurchaseDate").Value = txtPurchaseDate.Text 
End If 
+0

会尝试先生brb反馈谢谢 – ivandinglasan 2013-05-02 01:17:01

+0

IsNull(txtPurchaseDate.Text)检查可能不是绝对必要的 - 我认为txtPurchaseDate .Text将为空字符串,“”如果未设置。您可以通过在运行时检查该值来检查这一点。虽然它可能比不包括支票更安全。 – Ryan 2013-05-02 01:18:26

+0

IsNull未声明先生 – ivandinglasan 2013-05-02 01:19:13

0

为什么不使用的DateTimePicker为您而purchaseDate代替txtPurchaseDate.Text你一个文本框能说出你的控制dtpPurchaseDate那么你必须:

cmd.Parameters("@OE_PurchaseDate").Value = dtpPurchaseDate.Value 

默认值(或最小值)为DateTime Picker为1/1/1980,因此您可以将dtpPurchaseDate的值初始化为1/1/1980,如:

dtpPurchaseDate = System.DateTime.Parse("1/1/1980") 

所以,这意味着顺便说一句,当存储在你的数据库中它的值为1/1/1980而不是NULL。

如果你想用文本框钱包,那么你可以检查是否为空,则指定最小日期值实际上是1/1/0001这样的:

If (If (String.IsNullOrEmpty(txtPurchaseDate.Text)) Then 
    cmd.Parameters("@OE_PurchaseDate").Value = DBNull.Value 
Else 
    Dim tempPurchaseDate as DateTime 

    System.DateTime.TryParse(txtPurchaseDate.Text, tempPurchaseDate) 
    cmd.Parameters("@OE_PurchaseDate").Value = tempPurchaseDate   
End If 

但同样它在储值你的数据库1/1/0001

你可以显示在你的文本框状空: 鉴于你有一个DataRow名为博士

If (dr["OE_PurchaseDate"] = System.DateTime.Parse("1/1/0001")) Then 
    txtPurchaseDate.Text = "" 
Else 
    txtPurchaseDate.Text = dr["OE_PurchaseDate"] 
End If 
+0

如果我不保留它而不改变任何默认日期,该怎么办? – ivandinglasan 2013-05-02 01:48:12