2012-06-13 3 views
3

asp.net Webservice에 4 개의 매개 변수를 전달합니다.오류 : "데이터 형식을 nvarchar를 숫자로 변환하는 중 오류 발생"

WEBMETHOD :

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    [WebMethod] 
    public List<RaumHelper.RAUM> Raum(string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID) 
    { 
     return RaumHelper.Raum(RAUMKLASSE_ID, STADT_ID, GEBAEUDE_ID, REGION_ID); 
    } 

Helperclass이 지금까지 내 코드입니다

public class RaumHelper 
      { 
       public class RAUM 
       { 
        public string RaumName { get; set; } 
        public string RaumID { get; set; } 

       } 

       internal static List<RAUM> Raum(string RAUMKLASSE_ID, string STADT_ID, string GEBAEUDE_ID, string REGION_ID) 
       { 
        List<RAUM> strasseObject = new List<RAUM>(); 

        using (SqlConnection con = new SqlConnection(@"Data Source=Localhost\SQLEXPRESS;Initial Catalog=BOOK-IT-V2;Integrated Security=true;")) 
        using (SqlCommand cmd = new SqlCommand(@"SELECT r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID FROM RAUM r WHERE RAUMKLASSE_ID = @Raumklasse_ID OR STADT_ID = @Stadt_ID OR GEBAEUDE_ID = @Gebaeude_ID OR REGION_ID = @Region_ID", con)) 
        { 


         con.Open(); 
         cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID); 
         cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID); 
         cmd.Parameters.AddWithValue("@Gebaeude_ID", GEBAEUDE_ID); 
         cmd.Parameters.AddWithValue("@Region_ID", REGION_ID); 



         using (SqlDataReader rdr = cmd.ExecuteReader()) 
         { 



          while (rdr.Read()) 
          { 



           if (rdr["BEZEICHNUNG"] != DBNull.Value && rdr["ID"] != DBNull.Value) 
           { 

            strasseObject.Add(new RAUM() 
            { 
             RaumName = rdr["BEZEICHNUNG"].ToString(), 
             RaumID = rdr["ID"].ToString() 

            }); 
           } 

          } 
         } 
        } 
        return strasseObject; 
       } 

      } 

내가 WEBMETHOD는 4 개 매개 변수와 함께,이 방법은 잘 작동하는지 호출하는 I가의 목록을 얻을 경우 RaumName과 RaumID. 하지만 하나만 넣으면 매개 변수 iam에 오류가 발생합니다.

System.Data.SqlClient.SqlException: Error converting data type nvarchar to numeric. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.HasMoreRows() 
    at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) 
    at System.Data.SqlClient.SqlDataReader.Read() 

데이터베이스의 ID는 숫자로 저장되고 문자열은 전달됩니다. 나는 이것이 문제라고 생각한다. 그러나 나는 이것을 어떻게 고칠 지 모른다.

내 검색어가 두 개 또는 세 개의 입력 된 매개 변수에도 적용되기를 바랍니다.

감사합니다.

+0

데이터 유형 및 기본 값을 정의 좋아하세요 매개 변수, 문제를 해결한다. –

+0

WebMethod는 어디에 있습니까? 누락 된 매개 변수에 대한 기본값이 있습니까? –

답변

7

을 intger하기 위해 문자열 변환 문자열의 내용을 숫자 값 자체로 변환합니다. 작동하지 않으면이 오류가 발생합니다.

예를 들어, "Hello"을 숫자 매개 변수로 전달하면 오류가 발생합니다. 패스 "1234"하지 않습니다. 빈 문자열이나 공백이 포함 된 문자열은 숫자 값으로 변환 될 수 없습니다.

그러나 그렇게하려면 좋은 스타일이 아니어야합니다. 문제를 피하려면 응용 프로그램에서 사용하는 유형이 데이터베이스의 유형과 일치해야합니다. 응용 프로그램에 string 유형이 필요한 이유에 대한 자세한 내용이 도움이 될 수 있습니다. 쿼리에 대한 매개 변수는 선택 만들려면

EDIT 1
는 이동하는 방법은 다음과 같습니다

  1. WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) 같은 선택적 매개 변수를 허용하도록 SQL 문을 변경합니다.
  2. 는 선택해야하는 경우 @Raumklasse_ID 매개 변수를 추가하거나 값 당신은 정말 int? 같은 nullable 형식에 string 속성을 변경 고려해야 DBNull.Value

를 추가하지 마십시오.

편집 2
이 코드는 내가 편집 1에 제안 된 변경 사항을 적용 볼 수있는 방법입니다 :

using (SqlCommand cmd = new SqlCommand(@"SELECT r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID FROM RAUM r WHERE RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) OR STADT_ID = ISNULL(@Stadt_ID, STADT_ID) OR GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) OR REGION_ID = ISNULL(@Region_ID, REGION_ID)", con)) 
{ 
    con.Open(); 
    if (!String.IsNullOrWhitespace(RAUMKLASSE_ID)) 
     cmd.Parameters.AddWithValue("@Raumklasse_ID", RAUMKLASSE_ID); 
    else 
     cmd.Parameters.AddWithValue("@Raumklasse_ID", DBNull.Value); 
    if (!String.IsNullOrWhitespace(STADT_ID)) 
     cmd.Parameters.AddWithValue("@Stadt_ID", STADT_ID); 
    else 
     cmd.Parameters.AddWithValue("@Stadt_ID", DBNull.Value); 
    if (!String.IsNullOrWhitespace(GEBAEUDE_ID)) 
     cmd.Parameters.AddWithValue("@Gebaeude_ID", GEBAEUDE_ID); 
    else 
     cmd.Parameters.AddWithValue("@Gebaeude_ID", DBNull.Value); 
    if (!String.IsNullOrWhitespace(REGION_ID)) 
     cmd.Parameters.AddWithValue("@Region_ID", REGION_ID); 
    else 
     cmd.Parameters.AddWithValue("@Region_ID", DBNull.Value); 
    ... 
} 
+0

매개 변수를 선택적으로 만드는 방법을 보여주기 위해 내 대답을 편집했습니다. –

+0

도움 주셔서 대단히 감사합니다. 알겠습니다 :). 그것은 지금 매력처럼 작동합니다. 그러나 "else"가 무엇을하는지 설명 할 수 있습니까? 실제로는 알 수 없습니다. – Paks

+0

'else'는 주어진 이름의 매개 변수를 쿼리에 추가하지만 SQL 서버의'null' 값을 할당합니다 (실제로'null 'C에서 # 및 SQL Server에서'null'은 다릅니다). 이는 매개 변수가 쿼리에 제공되지만 'null'인지 확인하기위한 것입니다. 스토어드 프로 시저를 호출하는 동안 매개 변수가 SQL에서 디폴트 값 'null'을 갖도록 선언 된 경우 'else' 브랜치 없이도 코드가 작동합니다.'else' 브랜치없이 작동하는지 여부는 확실하지 않습니다. 너의 경우. 매개 변수 X가 예상되었지만 제공되지 않았다는 오류가 표시 될 수 있습니다. –

0

매개 변수의 값을 설정하지 않았으므로 데이터 유형을 추론 할 수있는 아무 것도 지정하지 않는 것이 문제 일 수 있습니다. 다음과 같이 추가 방법을 사용하여 매개 변수를 설정

시도 : 값을 설정하지 않으려면

cmd.Parameters.Add("@Raumklasse_ID", SqlDbType.Int).Value = RAUMKLASSE_ID; 

그런 식으로, 당신은 여전히 ​​매개 변수를 정의 할 수 있습니다.

더 여기를 참조하십시오 : http://msdn.microsoft.com/en-us/library/wbys3e9s

0

보통은만큼 SQL 서버 수와 ​​같은 숫자의 매개 변수에 string을 통과 할 수있는 문제가 아니다 유형을

cmd.Parameters.AddWithValue("@Raumklasse_ID", Convert.ToInt32(RAUMKLASSE_ID)); 
cmd.Parameters.AddWithValue("@Stadt_ID", Convert.ToInt32(STADT_ID)); 
cmd.Parameters.AddWithValue("@Gebaeude_ID", Convert.ToInt32(GEBAEUDE_ID)); 
cmd.Parameters.AddWithValue("@Region_ID", Convert.ToInt32(REGION_ID)); 
+0

나는 당신의 해결책을 시도했다. 하지만 다른 iam 얻는 오류 : System.FormatException : 입력 문자열이 올바른 형식이 아닙니다. – Paks

+0

@Paks : 즉, Convert.Int32 함수에 stringable이 아닌 형식을 전달하고 있음을 의미합니다. 그래서 변수의 값이 NULL 인 것 같습니다. Visual Studio breakpoitns를 사용하여 어떤 변수 값이 null인지 확인하십시오. – Shyju

0

cmd.Parameters.Add("@Raumklasse_ID", SqlDbType.Int);// use here your SQL DataType, if it is numberic than use Numeric. 
cmd.Parameters[0].value = Convert.ToInt32(RAUMKLASSE_ID); 
관련 문제