2013-04-30 3 views
1

vb.net에서이 저장 프로 시저를 실행하고 업데이트 텍스트 상자를 비워두면 업데이트시 null이됩니다. String이 유효한 DateTime으로 인식되지 않는다는 오류를 반환합니다. 코드 작업을위한 제안은 많은 도움이 될 것입니다.매개 변수의 기본값을 지정하십시오.

CREATE PROCEDURE UpdateEquipmentProfile 

    (
    @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 

    IF EXISTS(SELECT * FROM tblOfficeEquipmentProfile WHERE [email protected]_ID) 

    UPDATE tblOfficeEquipmentProfile SET 
    OE_Category   [email protected]_Category, 
    OE_SubCategory  [email protected]_SubCategory, 
    OE_Name   [email protected]_Name, 
    OE_User   [email protected]_User, 
    OE_Brand   [email protected]_Brand, 
    OE_Model   [email protected]_Model, 
    OE_Specs   [email protected]_Specs, 
    OE_SerialNo   [email protected]_SerialNo, 
    OE_PropertyNo  [email protected]_PropertyNo, 
    OE_MacAddress  [email protected]_MacAddress, 
    OE_Static_IP  [email protected]_Static_IP, 
    OE_Vendor   [email protected]_Vendor, 
    OE_PurchaseDate  [email protected]_PurchaseDate, 
    OE_WarrantyInclusiveYear [email protected]_WarrantyInclusiveYear, 
    OE_WarrantyStatus  [email protected]_WarrantyStatus, 
    OE_Status   [email protected]_Status, 
    OE_Dept_Code  [email protected]_Dept_Code, 
    OE_Location_Code  [email protected]_Location_Code, 
    OE_Remarks   [email protected]_Remarks 

    WHERE [email protected]_ID 
    GO 

VB.NET 코드

Dim cmd As SqlCommand = sqlconn.CreateCommand 
    sqlconn.Open() 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.CommandText = "UpdateEquipmentProfile" 

    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 Updated Equipment Profile") 
    sqlconn.Close() 
+1

빈 문자열 인 경우에도 문자열이 아닌 NULL (아마도 DB.Null even)을 전달해야합니다. 이름이 지정된 매개 변수 (실제로 "기본값"을 사용하는 데 필요함)를 사용하여 SP proc를 호출하는 기능은 SP가 호출되는 방식에 따라 달라지며 이는 표시되지 않습니다. 그러나 두 경우 모두 클라이언트 쪽에서 적절한 "NULL"(또는 "지정되지 않음")에 매핑하는 것을 알아야합니다. – user2246674

+0

@ user2246674 NULL 값을 전달하는 법? 나는 퍼팅 시도했다 .value = DBNULL.Value 그런 vb.net 뭔가를하지만 여전히 나던 작업 선생 – ivandinglasan

+0

txtPurchaseDate.Text 비어 있지 않으면 다음 매개 변수를 바인딩, 그렇지 않으면 아무것도하지 마십시오. –

답변

0
Dim d as DateTime 
DateTime.TryParse(txtPurchaseDate.Text, d) 

그런 다음 저장된 프로 시저 호출에 d를 전달합니다.

cmd.Parameters("@OE_PurchaseDate").Value = d 
+0

저장 proc 선생님에게 전달할 수 있습니까? 메신저 좀 새로운 매개 변수 – ivandinglasan

+0

당신은 저장된 proc 호출에 사용하는 VB 코드를 제공하고 – Rots

+0

친절하게 내 VB 코드를 확인하십시오 – ivandinglasan

1

매개 변수가 NULL의 기본값이 있기 때문에 :

@OE_PurchaseDate  smalldatetime = NULL, 

당신은 예를 들어

에 전달하는 값이없는 경우 값을 전달하도록 강요되지 않습니다

if txtPurchaseDate.Text <> "" then 
    cmd.Parameters("@OE_PurchaseDate").Value = txtPurchaseDate.Text 
+0

유효하지 않은 DateTime이 저장 프로 시저에 전달되지 않도록하려면'TryParse'를 대신 사용하여 실패하게됩니다. 'DateTime.TryParse (txtPurchaseDate.Text, d) Then''과'd'가 'DateTime'입니다. 그런 다음 변환이 성공하면 매개 변수에'd '를 지정할 수 있습니다 (빈 문자열/널 문자열에서 실패합니다). – Tim

+0

@Tim, 동의하지만, UI에 적절한 캘린더 컨트롤이 있다면, 아마 괜찮은가요? –

+0

작동 단어 인 경우. OP 코드는 TextBox이므로 UI가 무엇인지 알 수 없습니다. 어쨌든, 나는주의의 측면에서 잘못하고 싶다 - 만약 사용자가 바보 같은 일을 할 수 있다면, 그들은 다음과 같이 말할 것이다. – Tim

관련 문제