代码之家  ›  专栏  ›  技术社区  ›  Grahame A

访问远程存储过程时出现语法错误

  •  0
  • Grahame A  · 技术社区  · 14 年前

    StackOverflow——我仍在尝试部署这个站点,但随着我解决的每个问题,又出现了另一个问题。无论如何-我已经在宿主处设置了允许远程连接的数据库,它正在运行SQL Server 2005。在我的开发机器上,我正在使用SQL Server 2008。

    我已经在宿主数据库上安装了ASP.NET架构,并从ASP.NET Web管理界面创建了几个用户,并测试了登录是否有效。使用远程连接字符串在本地运行应用程序会得到相同的结果。但是-我可以运行我的脚本并生成我的表和存储过程而不会出错-但是当站点运行时,我在所有试图访问存储过程的.aspx页面上都会出现以下错误:

    Server Error in '/' Application.
    Incorrect syntax near 'LoadProfileData'.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
    
    Exception Details: System.Data.SqlClient.SqlException: Incorrect syntax near 'LoadProfileData'.
    
    Source Error:
    
    Line 62:             adapter.SelectCommand.Parameters.Add("@ProfessionalName", SqlDbType.VarChar).Value = professionalName;
    Line 63:             DataSet profile = new DataSet();
    Line 64:             adapter.Fill(profile, "Profile");
    Line 65:             return profile;
    Line 66:         }
    

    这可能是SQL 2005与2008的问题吗?我希望其他人也能在类似的情况下看到这个问题,并能为我指明正确的方向。服务器正在运行ASP.NET 2.0、3.0和3.5以及IIS 7.0。

    存储过程:

    -- =============================================
    -- Create date: <July 2010>
    -- Description: <Create default Professional Profile>
    -- =============================================
    Drop procedure CreateDefaultProfile
    GO
    Create procedure CreateDefaultProfile(@UserName varchar(256))
    as
        declare @ProfessionalID uniqueidentifier
        set @ProfessionalID = (select UserId from aspnet_Users where UserName = @UserName)
    
    
        declare @email varchar(256)
        set @email = (select Email from aspnet_Membership where UserId = @ProfessionalID)
    
        insert into Professional(ProfessionalID, Name, Email, Phone, TypeID, DisplayPictureUrl, ProfileHeader, ProfileSubHeader, ProfileContent, ServicesHeader, ServicesContent)
        values (@ProfessionalID, '', @email, '', '', 'css/img/profilepicture_default.jpg', '', '', '', '', '')
    
    
        GO
    
        -- exec CreateDefaultProfile 'Mounir'
        -- select * from Professional
    

    数据访问层方法:

    //"Data Source=localhost;Initial Catalog=MHNProServices;Integrated Security=SSPI"
            const string ConnectionString =
                "Data Source=mhnproservices.db.5322869.hostedresource.com; Initial Catalog=mhnproservices; User ID=mhnproservices; Password='***********'";
    
            internal static void CreateDefaultProfile(string professionalName)
            {
                SqlConnection conn = new SqlConnection(ConnectionString);
                SqlDataAdapter adapter = new SqlDataAdapter("CreateDefaultProfile @ProfessionalName", conn);
                adapter.SelectCommand.Parameters.Add("@ProfessionalName", SqlDbType.VarChar).Value = professionalName;
    
                conn.Open();
                adapter.SelectCommand.ExecuteNonQuery();
                conn.Close();
            }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Grahame A    14 年前

    我需要在过程调用之前添加exec。这仅仅是2005年和2008年的语法差异吗?无论如何,以下工作:

     SqlDataAdapter adapter = new SqlDataAdapter("exec CreateDefaultProfile @ProfessionalName", conn);
    
        2
  •  1
  •   marc_s dmck    14 年前

    如果您想要执行一个存储过程(一般来说),那么这就太复杂了——为什么要使用 SqlDataAdapter 打电话 ExecuteNonQuery 最后??

    请尝试以下代码:

     internal static void CreateDefaultProfile(string professionalName)
     {
         using(SqlConnection conn = new SqlConnection(ConnectionString))
         {
             using(SqlCommand cmd = new SqlCommand("CreateDefaultProfile", conn))
             {
                 cmd.CommandType = CommandType.StoredProcedure;
                 cmd.Parameters.Add("@ProfessionalName", 
                         SqlDbType.VarChar, 100).Value = professionalName;
    
                 conn.Open();
                 cmd.ExecuteNonQuery();
                 conn.Close();
             }
        }
    }
    

    如果你只是打电话 执行查询 只要使用 SqlCommand 要做到这一点,您也可以告诉它正在调用一个存储过程!同时将ADO.NET内容包装到 using() {....} 块以确保它被很好地处理。最后但不是最不重要的:为varchar参数定义一个长度。

    有了这些变化,一切都应该顺利地进行。

        3
  •  0
  •   Philip Smith    14 年前

    错误消息告诉您您的SQL不正确。显示的C代码是执行SQL的位置。为了帮助您,我需要查看SQL代码,大概是存储过程源代码。

    也许您可以更新问题以显示SQL?