0

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 vs 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(); 
     } 
+1

这将有助于看到实际的源代码 – 2010-07-23 22:55:47

回答

1

我需要在过程调用之前添加exec。这仅仅是2005年和2008年之间的语法差异?不管怎么说,以下工作:

SqlDataAdapter adapter = new SqlDataAdapter("exec CreateDefaultProfile @ProfessionalName", conn); 
+3

我不知道。我会创建一个'SqlCommand'对象。将其设置为类型存储过程并分配过程名称。然后将其传递给'SqlDataAdapter'。请参阅http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx。此方法不依赖于SQL版本。 – 2010-07-23 23:16:31

0

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

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

+0

谢谢,我提供了上面的代码,其中重要的是要注意我*在连接字符串中输出密码。 – Gallen 2010-07-23 23:02:30

+0

我正在查看SQL,但没有看到对“LoadProfileData”的引用。错误消息表明语法错误在那里。所以这不是产生错误的SQL,除非'Professional'表具有插入触发器。 – 2010-07-23 23:11:59

+0

此错误出现在所有存储过程中,我发布了错误消息中描述的错误,但问题已修复,感谢您的帮助。 – Gallen 2010-07-24 00:01:34

1

如果要执行存储过程(一般),你这样做太复杂 - 为什么要使用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(); 
     } 
    } 
} 

如果你曾经只调用ExecuteNonQuery,只使用一个SqlCommand做到这一点 - 你可以告诉它,它的调用存储过程呢!同时将你的ADO.NET的东西包装成using() {....}块,以确保它得到很好的处理。最后但并非最不重要的:为您的VARCHAR参数定义一个长度。

随着这些变化,一切都应该工作得很好,非常顺利。