복붙노트

[SQL] ExecuteScalar는 (); SCOPE_IDENTITY ()로 생성 "System.InvalidCastException : 지정한 캐스트가 잘못되었습니다"[중복]

SQL

ExecuteScalar는 (); SCOPE_IDENTITY ()로 생성 "System.InvalidCastException : 지정한 캐스트가 잘못되었습니다"[중복]

나는 (텍스트 상자와 checkboxlist를 통해) 다양한 데이터를 수용 형태가했습니다와 클릭 이벤트에 그들은 다음 테이블 및 선택합니다 SCOPE_IDENTITY에 모든 데이터를 삽입 checkboxlist 항목의 삽입에서 사용할 수있는 변수에 저장 다른 테이블로 루프를 사용

! 많은 답변 예에 따라이 .. 완벽하게 작동해야하지만 날이 오류를 제공합니다 :

Exception Details: System.InvalidCastException: Specified cast is not valid.

Line 66:             int NewBrandId = (int)comm.ExecuteScalar(); 

여기 내하는 LinkButton 방법 코드는 다음과 같습니다

   protected void lnkbtnUploadAndSubmit_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MOODbCenterConnection"].ConnectionString);

        SqlCommand comm = new SqlCommand("INSERT INTO Brands (BrandName, BrandLogo, BrandWebsite, IsBrandVisible) VALUES (@Name, @Logo, @Website, @IsVisible); SELECT scope_identity();", conn);

        comm.Parameters.Add("@Name", System.Data.SqlDbType.NVarChar, 50);
        comm.Parameters["@Name"].Value = txtbxBrandName.Text;

        comm.Parameters.Add("@Logo", System.Data.SqlDbType.Text);
        comm.Parameters["@Logo"].Value = fileuploadLogo.PostedFile.FileName;

        comm.Parameters.Add("@Website", System.Data.SqlDbType.Text);
        comm.Parameters["@Website"].Value = txtbxWebsite.Text;

        comm.Parameters.Add("@IsVisible", System.Data.SqlDbType.Bit);
        comm.Parameters["@IsVisible"].Value = chkbxIsPublished.Checked;
        conn.Open();


        int NewBrandId = (int)comm.ExecuteScalar(); 

        conn.Close();

        foreach (ListItem li in chkbxlstCuisines.Items)
        {
            if (li.Selected)
            {
                conn.Open();

                SqlCommand comm2 = new SqlCommand("INSERT INTO BrandCuisines (CuisineId, BrandId) VALUES (@CuisineId, @NewBrandId)", conn);

                comm2.Parameters.Add("@CuisineId", System.Data.SqlDbType.Int);
                comm2.Parameters["@CuisineId"].Value = li.Value;

                comm2.Parameters.Add("@NewBrandId", System.Data.SqlDbType.Int);
                comm2.Parameters["@NewBrandId"].Value = NewBrandId;
                comm2.ExecuteNonQuery();
                conn.Close();
            }
        }
    }

내가 비주얼 스튜디오의 SQL 서버 익스프레스에서 직접 실행하면 편집 이상하게 쿼리는 잘 작동합니다!

이 이상한 문제에 대한 이상한 설명

alexb에 의한 최초의 솔루션 :

Example : int NewBrandId = System.Convert.ToInt32(comm.ExecuteScalar());

내게로 두 번째 해결 방법 :

감사 녀석과 나는 다른 사람을 도울 바랍니다!

해결법

  1. ==============================

    1.정확히 무슨 comm.ExecuteScalar () 반환? 아마 긴 또는 더블 객체로 포장 반환합니다. 정확히 기억하지만 1 ~ 2 년 전 얼굴 뭔가했다처럼 보인다 수 없습니다.

    정확히 무슨 comm.ExecuteScalar () 반환? 아마 긴 또는 더블 객체로 포장 반환합니다. 정확히 기억하지만 1 ~ 2 년 전 얼굴 뭔가했다처럼 보인다 수 없습니다.

  2. ==============================

    2.당신은 SQL을 변경할 수 있다면, 더 쉬운 방법은하는 것

    당신은 SQL을 변경할 수 있다면, 더 쉬운 방법은하는 것

    SELECT CONVERT(int, SCOPE_IDENTITY())
    
  3. ==============================

    3.Dimi 말했듯이, 신원은 SQL 숫자 (.NET 진수)입니다. 이 작업을해야합니다 :

    Dimi 말했듯이, 신원은 SQL 숫자 (.NET 진수)입니다. 이 작업을해야합니다 :

    decimal decimalBrandId = (decimal)comm.ExecuteScalar(); 
    int NewBrandId = (int)decimalBrandId;
    
  4. ==============================

    4.) (SCOPE_IDENTITY에 대한 설명서에서

    ) (SCOPE_IDENTITY에 대한 설명서에서

    Return Types
    
    numeric(38,0) 
    

    쉬운 솔루션은 다음과 같은 것이다 그래서

    DECLARE @ReturnValue INT;
    
    /*
       Do your insert stuff here.
    */
    
    SELECT @ReturnValue = SCOPE_IDENTITY();
    SELECT @ReturnValue;
    
  5. ==============================

    5.SET NOCOUNT ON을 추가하려고; 삽입하기 전에.

    SET NOCOUNT ON을 추가하려고; 삽입하기 전에.

  6. from https://stackoverflow.com/questions/4413178/executescalar-with-scope-identity-generating-system-invalidcastexception by cc-by-sa and MIT license