복붙노트

[SQL] 제공되지 않은 저장 프로 시저 또는 기능이 기대 파라미터

SQL

제공되지 않은 저장 프로 시저 또는 기능이 기대 파라미터

내가 저장 프로 시저를 호출하여 SQL Server 데이터베이스에 데이터를 삽입하려고하지만 오류를 얻고있다

내 저장 프로 시저가 SHOWuser이라고합니다. 나는 그것을 철저하게 확인하고 매개 변수가 누락되지 않습니다.

내 코드는 다음과 같습니다

public void SHOWuser(string userName, string password, string emailAddress, List<int> preferences)
{
        SqlConnection dbcon = new SqlConnection(conn);

        try
        { 
            SqlCommand cmd = new SqlCommand();

            cmd.Connection = dbcon;
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "SHOWuser";

            cmd.Parameters.AddWithValue("@userName", userName);
            cmd.Parameters.AddWithValue("@password", password);
            cmd.Parameters.AddWithValue("@emailAddress", emailAddress);

            dbcon.Open();

            int i = Convert.ToInt32(cmd.ExecuteScalar());

            cmd.Parameters.Clear();
            cmd.CommandText = "tbl_pref";

            foreach (int preference in preferences)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@userID", Convert.ToInt32(i));
                cmd.Parameters.AddWithValue("@preferenceID", Convert.ToInt32(preference));

                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            dbcon.Close();
        }

및 저장 프로 시저입니다 :

ALTER PROCEDURE [dbo].[SHOWuser]
(
    @userName varchar(50),
    @password nvarchar(50),
    @emailAddress nvarchar(50)
)
AS
BEGIN
    INSERT INTO tbl_user(userName, password, emailAddress) 
    VALUES (@userName, @password, @emailAddress)

    SELECT
        tbl_user.userID, tbl_user.userName,
        tbl_user.password, tbl_user.emailAddress, 
        STUFF((SELECT ',' + preferenceName 
               FROM tbl_pref_master
               INNER JOIN tbl_preferences ON tbl_pref_master.preferenceID = tbl_preferences.preferenceID
               WHERE tbl_preferences.userID = tbl_user.userID
               FOR XML PATH ('')), 1, 1, ' ' ) AS Preferences
    FROM
        tbl_user

    SELECT SCOPE_IDENTITY();
END

이것은 동일한 기능에 사용되는 제 2 저장 프로 시저 tbl_pref이다 :

ALTER PROCEDURE [dbo].[tbl_pref]
    @userID int,
    @preferenceID int
AS
BEGIN
    INSERT INTO tbl_preferences(userID, preferenceID) 
    VALUES (@userID, @preferenceID)
END

해결법

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

    1.귀하의 저장 프로 시저 입력으로 5 개 매개 변수를 기대

    귀하의 저장 프로 시저 입력으로 5 개 매개 변수를 기대

    @userID int, 
    @userName varchar(50), 
    @password nvarchar(50), 
    @emailAddress nvarchar(50), 
    @preferenceName varchar(20) 
    

    이 SP 호출에 모두 5 개 매개 변수를 추가해야합니다 그래서 :

        cmd.CommandText = "SHOWuser";
        cmd.Parameters.AddWithValue("@userID",userID);
        cmd.Parameters.AddWithValue("@userName", userName);
        cmd.Parameters.AddWithValue("@password", password);
        cmd.Parameters.AddWithValue("@emailAddress", emailAddress);
        cmd.Parameters.AddWithValue("@preferenceName", preferences);
        dbcon.Open();
    

    PS : 이러한 매개 변수가 무엇인지 명확하지 않다. 당신의 SP는 모습이 좋아한다, 그래서 당신은 당신의 SP 본체에 이러한 매개 변수를 사용하지 마십시오 :

    ALTER PROCEDURE [dbo].[SHOWuser] AS BEGIN ..... END
    
  2. ==============================

    2.내 경우에는 내가 모든 매개 변수 값이 제대로 공급되었지만 명령의 유형이 지정되지 않은 경우에도이 예외를 받았다 :

    내 경우에는 내가 모든 매개 변수 값이 제대로 공급되었지만 명령의 유형이 지정되지 않은 경우에도이 예외를 받았다 :

    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    

    이것은 위의 분명 문제가있는 경우가 아니라,하지만 난 그를 지정하기로 결정 있도록 예외 설명은 매우,이 경우 취소되지 않습니다.

  3. ==============================

    3.그러나 그들이 올바른 방향으로 포인트 나를했다, 어제이 문제를 건너 왔어요,하지만 해결책으로 여기 정확히 작동하지 않습니다.

    그러나 그들이 올바른 방향으로 포인트 나를했다, 어제이 문제를 건너 왔어요,하지만 해결책으로 여기 정확히 작동하지 않습니다.

    우리의 응용 프로그램은 C #과 지나치게 단순화 작성된 워크 플로우 도구 여러 저장된 데이터베이스 절차뿐만 아니라, 각각의 프로 시저에 의해 사용 된 각 매개 변수에 대한 메타 데이터 테이블 (이름, 순서, 데이터 형식, 사이즈 등)을 가지고 우리는 C 번호를 변경하지 않고 필요에 따라 우리를 허용하는 것은 많은 새로운 저장 프로 시저로 만들 수 있습니다.

    영업 가지고 같은 문제의 분석은 우리의 코드가 실행 된 그러나되면, SqlCommand 개체의 모든 올바른 매개 변수를 설정하는 것으로 나타났다, 동일한 오류가 발생했습니다.

    또한 분석은 일부 매개 변수가 null 값을 한 것으로 나타났습니다. 그래서 저는 SqlCommand를가 null 값으로 자신 또한 .Parameters 모음에있는 SqlParameter에 객체를 무시 객체 있다는 결론을 도출해야합니다.

    내가 찾은이 문제에 대한 두 가지 해결책이 있습니다.

    원래 코더에 이동하고 코드가 원래 염두에 해결 방법 1로 기록되었고, 모두의 장점을 무게 데, 나는 그것은 특정 저장 프로 시저에 대한 기본 값을 지정하는 것이 훨씬 쉽게 내가 해결 방법 1. 스틱 것 같아요 그것을 작성할 때 코드에 정의 된대로 항상 NULL 것보다는.

    누군가가 도움이되기를 바랍니다.

  4. ==============================

    4.나는 C #을 측면에서 올바르게 설정에도 불구하고 내 경우에는 내가 내가 저장 프로 시저에 출력 매개 변수에 대한 디폴트 값을 제공하는 것을 잊었다 알아 냈 출력 매개 변수에 오류가 발생했습니다

    나는 C #을 측면에서 올바르게 설정에도 불구하고 내 경우에는 내가 내가 저장 프로 시저에 출력 매개 변수에 대한 디폴트 값을 제공하는 것을 잊었다 알아 냈 출력 매개 변수에 오류가 발생했습니다

    ALTER PROCEDURE [dbo].[test]
    (
                    @UserID int,
                    @ReturnValue int = 0 output --Previously I had @ReturnValue int output
    )
    
  5. ==============================

    5.내 경우에는, 그것은 하나의 출력 매개 변수를 반환하고 있으며 값을 반환하지 않았다. 그래서 그것을 변경

    내 경우에는, 그것은 하나의 출력 매개 변수를 반환하고 있으며 값을 반환하지 않았다. 그래서 그것을 변경

    param.Direction = ParameterDirection.Output;
    command.ExecuteScalar();
    

    다음은 크기 오류를 던지고 있었다. 그래서 크기도 설정했다

    SqlParameter param = new SqlParameter("@Name",SqlDbType.NVarChar);
    param.Size = 10;
    
  6. from https://stackoverflow.com/questions/19703653/stored-procedure-or-function-expects-parameter-which-is-not-supplied by cc-by-sa and MIT license