2012-08-13 124 views
0

我目前有一個更新語句運行在C#和前端編輯我的SQL Server數據庫中的一些值。但是我收到了轉換失敗錯誤。我似乎無法找到源代碼。轉換失敗

錯誤消息

Conversion failed when converting the nvarchar value 'UPDATE T_ROLLUP_SYSTEM_EXCEPT 
      SET DEPT_ID = ' to data type int. 
14 

的Sql

ALTER PROCEDURE [dbo].[USP_UPDATE_SYS_MAPPING] 
-- Add the parameters for the stored procedure here 
@SYSTEM VARCHAR(50), 
@UNIT VARCHAR(50), 
@MEDCTRLEVEL VARCHAR(50), 
@MEDCTR VARCHAR(50), 
@FACID VARCHAR(50), 
@ENTN VARCHAR(50), 
@DEPT_ID INT, 
@ROLLUP_TYPE_ID INT 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 
DECLARE @SQL VARCHAR(MAX); 
DECLARE @MEDCTRID INT; 

SELECT @MEDCTRID = MED_CTR_ID FROM T_ROLLUP_MED_CTR WHERE MED_CTR = @MEDCTR 
PRINT (@MEDCTRID); 

-- Insert statements for procedure here 
SET @SQL = N'UPDATE T_ROLLUP_SYSTEM_EXCEPT 
      SET DEPT_ID = 
       '''[email protected]_ID'''     , ROLLUP_TYPE_ID = '''[email protected]_TYPE_ID+''' 
       , UPDATE_DT = GETDATE() 
      WHERE SYSTEM = '''[email protected]+''' 
       AND ENTN = '''[email protected]+''' 
       AND MED_CTR_ID = '+CONVERT(VARCHAR,@MEDCTRID)+' 
       AND MED_CTR_LEVEL = '''[email protected]+''' 
       AND FAC_ID = '''[email protected]+''' 
       AND UNIT = '''[email protected]+'''' 
PRINT (@SQL); 
EXEC (@SQL); 

HTML

  string[] mdctrvalue = medctr.Text.Split('[', ']'); 
      string[] mpvalue = mpSearch.Text.Split('(', ')'); 

      string sys = acctsys.ToString(); 
      string unit = txtunit.ToString(); 
      string mdctrlvl = mdctrvalue[1].ToString(); 
      string mdctr = mdctrvalue[0].ToString(); 
      string facid = fac.ToString(); 
      string entn = txtentn.ToString(); 
      string dept_id = dept.SelectedValue.ToString(); 
      string rollup_type_id = rolluptype.SelectedValue.ToString(); 

      SqlConnection myconn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Rollup2ConnectionString"].ConnectionString); 
      SqlCommand cmd = new SqlCommand(); 
      cmd.Connection = myconn; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.CommandText = "USP_UPDATE_SYS_MAPPING"; 
      cmd.Parameters.Add("@SYSTEM", SqlDbType.VarChar).Value = acctsys.ToString(); 
      cmd.Parameters.Add("@UNIT", SqlDbType.VarChar).Value = unit.ToString(); 
      cmd.Parameters.Add("@MEDCTRLEVEL", SqlDbType.VarChar).Value = mdctrlvl.ToString(); 
      cmd.Parameters.Add("@MEDCTR", SqlDbType.VarChar).Value = mdctr.ToString(); 
      cmd.Parameters.Add("@FACID", SqlDbType.VarChar).Value = facid.ToString(); 
      cmd.Parameters.Add("@ENTN", SqlDbType.VarChar).Value = entn.ToString(); 
      cmd.Parameters.Add("@DEPT_ID", SqlDbType.Int).Value = dept_id.ToString(); 
      cmd.Parameters.Add("@ROLLUP_TYPE_ID", SqlDbType.Int).Value = rollup_type_id.ToString(); 

      myconn.Open(); 
      int retVal = cmd.ExecuteNonQuery(); 

回答

4

也許改變:

[email protected]_TYPE_ID+ 

要:

+ CONVERT(VARCHAR(12), @ROLLUP_TYPE_ID) + 

你應該always specify a length for your varchar columns/variables ...

這就是說,你可以重新寫你的存儲過程不使用動態SQL在所有 - 爲什麼它被使用?

ALTER PROCEDURE [dbo].[USP_UPDATE_SYS_MAPPING] 
    @SYSTEM   VARCHAR(50), 
    @UNIT   VARCHAR(50), 
    @MEDCTRLEVEL VARCHAR(50), 
    @MEDCTR   VARCHAR(50), 
    @FACID   VARCHAR(50), 
    @ENTN   VARCHAR(50), 
    @DEPT_ID  INT, 
    @ROLLUP_TYPE_ID INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @MEDCTRID INT; 

    SELECT @MEDCTRID = MED_CTR_ID FROM dbo.T_ROLLUP_MED_CTR 
    WHERE MED_CTR = @MEDCTR; 

    PRINT (@MEDCTRID); 

    UPDATE dbo.T_ROLLUP_SYSTEM_EXCEPT 
    SET DEPT_ID = CASE 
     WHEN @DEPT_ID > 1 THEN @DEPT_ID 
     WHEN @DEPT_ID = 1 THEN NULL 
     ELSE REG_DEPT_ID1 END 
    , ROLLUP_TYPE_ID = @ROLLUP_TYPE_ID 
    , UPDATE_DT = GETDATE() 
    WHERE SYSTEM = @SYSTEM 
    AND ENTN = @ENTN 
    AND MED_CTR_ID = @MEDCTRID 
    AND MED_CTR_LEVEL = @MEDCTRLEVEL 
    AND FAC_ID = @FACID 
    AND UNIT = @UNIT; 
END 
GO 

如果它需要你還未共享某些原因動態SQL,你還是最好參數化儘可能多的這地使用sp_executesql代替EXEC()

+0

沒關係。我得到了它的工作。謝謝你的好建議! – user1512593 2012-08-13 18:49:14